package com.hpw.myapp.widget.imageselector.utils; import android.database.Cursor; import android.os.Bundle; import android.provider.MediaStore; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.text.TextUtils; import com.hpw.myapp.widget.imageselector.model.LocalMedia; import com.hpw.myapp.widget.imageselector.model.LocalMediaFolder; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; public class LocalMediaLoader { // load type public static final int TYPE_IMAGE = 1; public static final int TYPE_VIDEO = 2; private boolean hasFolderGened = false; private ArrayList<LocalMediaFolder> mResultFolder = new ArrayList<>(); private final static String[] IMAGE_PROJECTION = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.DATE_ADDED, MediaStore.Images.Media._ID}; private final static String[] VIDEO_PROJECTION = { MediaStore.Video.Media.DATA, MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.DATE_ADDED, MediaStore.Video.Media._ID, MediaStore.Video.Media.DURATION}; private int type = TYPE_IMAGE; private FragmentActivity activity; public LocalMediaLoader(FragmentActivity activity, int type) { this.activity = activity; this.type = type; } HashSet<String> mDirPaths = new HashSet<String>(); public void loadAllImage(final LocalMediaLoadListener imageLoadListener) { activity.getSupportLoaderManager().initLoader(type, null, new LoaderManager.LoaderCallbacks<Cursor>() { @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { CursorLoader cursorLoader = null; if (id == TYPE_IMAGE) { cursorLoader = new CursorLoader( activity, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION, MediaStore.Images.Media.SIZE + ">0 AND " + MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?", new String[]{"image/jpeg", "image/png"}, IMAGE_PROJECTION[2] + " DESC"); } else if (id == TYPE_VIDEO) { cursorLoader = new CursorLoader( activity, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, VIDEO_PROJECTION, null, null, VIDEO_PROJECTION[2] + " DESC"); } return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // ArrayList<LocalMediaFolder> imageFolders = new ArrayList<LocalMediaFolder>(); // LocalMediaFolder allImageFolder = new LocalMediaFolder(); // List<LocalMedia> allImages = new ArrayList<LocalMedia>(); // // while (data != null && data.moveToNext()) { // // 获取图片的路径 // String path = data.getString(data // .getColumnIndex(MediaStore.Images.Media.DATA)); // File file = new File(path); // if (!file.exists()) // continue; // // 获取该图片的目录路径名 // File parentFile = file.getParentFile(); // if (parentFile == null || !parentFile.exists()) // continue; // // String dirPath = parentFile.getAbsolutePath(); // // 利用一个HashSet防止多次扫描同一个文件夹 // if (mDirPaths.contains(dirPath)) { // continue; // } else { // mDirPaths.add(dirPath); // } // // if (parentFile.list() == null) // continue; // LocalMediaFolder localMediaFolder = getImageFolder(path, imageFolders); // // File[] files = parentFile.listFiles(new FilenameFilter() { // @Override // public boolean accept(File dir, String filename) { // if (filename.endsWith(".jpg") // || filename.endsWith(".png") // || filename.endsWith(".jpeg")) // return true; // return false; // } // }); // ArrayList<LocalMedia> images = new ArrayList<>(); // for (int i = 0; i < files.length; i++) { // File f = files[i]; // LocalMedia localMedia = new LocalMedia(f.getAbsolutePath()); // allImages.add(localMedia); // images.add(localMedia); // } // if (images.size() > 0) { // localMediaFolder.setImages(images); // localMediaFolder.setImageNum(localMediaFolder.getImages().size()); // imageFolders.add(localMediaFolder); // } // } if (data != null) { if (data.getCount() > 0) { List<LocalMedia> images = new ArrayList<>(); data.moveToFirst(); do { String path = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[0])); if (!fileExist(path)) { continue; } LocalMedia image = null; if (!TextUtils.isEmpty(path)) { image = new LocalMedia(path); // if (images.size() < 530) images.add(image); } if (!hasFolderGened) { // get all folder data File folderFile = new File(path).getParentFile(); if (folderFile != null && folderFile.exists()) { String fp = folderFile.getAbsolutePath(); LocalMediaFolder f = getFolderByPath(fp); if (f == null) { LocalMediaFolder folder = new LocalMediaFolder(); folder.setName(folderFile.getName()); folder.setPath(fp); List<LocalMedia> imageList = new ArrayList<>(); imageList.add(image); folder.setImages(imageList); folder.setFirstImagePath(imageList.get(0).getPath()); folder.setImageNum(1); mResultFolder.add(folder); } else { f.getImages().add(image); f.setImageNum(f.getImages().size()); } } } } while (data.moveToNext()); if (!hasFolderGened) { LocalMediaFolder folder = new LocalMediaFolder(); folder.setName("所有图片"); folder.setImages(images); folder.setFirstImagePath(images.get(0).getPath()); folder.setImageNum(images.size()); mResultFolder.set(0, folder); imageLoadListener.loadComplete(mResultFolder); hasFolderGened = true; } } } if (data != null) data.close(); } @Override public void onLoaderReset(Loader<Cursor> loader) { } }); } private boolean fileExist(String path) { if (!TextUtils.isEmpty(path)) { return new File(path).exists(); } return false; } private LocalMediaFolder getFolderByPath(String path) { if (mResultFolder != null) { for (LocalMediaFolder folder : mResultFolder) { if (TextUtils.equals(folder.getPath(), path)) { return folder; } } } return null; } private void sortFolder(List<LocalMediaFolder> imageFolders) { // 文件夹按图片数量排序 Collections.sort(imageFolders, new Comparator<LocalMediaFolder>() { @Override public int compare(LocalMediaFolder lhs, LocalMediaFolder rhs) { if (lhs.getImages() == null || rhs.getImages() == null) { return 0; } int lsize = lhs.getImageNum(); int rsize = rhs.getImageNum(); return lsize == rsize ? 0 : (lsize < rsize ? 1 : -1); } }); } private LocalMediaFolder getImageFolder(String path, List<LocalMediaFolder> imageFolders) { File imageFile = new File(path); File folderFile = imageFile.getParentFile(); for (LocalMediaFolder folder : imageFolders) { if (folder.getName().equals(folderFile.getName())) { return folder; } } LocalMediaFolder newFolder = new LocalMediaFolder(); newFolder.setName(folderFile.getName()); newFolder.setPath(folderFile.getAbsolutePath()); newFolder.setFirstImagePath(path); return newFolder; } public interface LocalMediaLoadListener { void loadComplete(List<LocalMediaFolder> folders); } }