package com.luck.picture.lib.model; 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.luck.picture.lib.R; import com.yalantis.ucrop.entity.LocalMedia; import com.yalantis.ucrop.entity.LocalMediaFolder; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * author:luck * project:LocalMediaLoader * package:com.luck.picture.ui * email:893855882@qq.com * data:16/12/31 */ public class LocalMediaLoader { public boolean isGif; public int index = 0; public long videoS = 0; 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 = FunctionConfig.TYPE_IMAGE; private FragmentActivity activity; public LocalMediaLoader(FragmentActivity activity, int type, boolean isGif, long videoS) { this.activity = activity; this.type = type; this.isGif = isGif; this.videoS = videoS; } 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; String select[] = null; String condition = ""; if (isGif) { select = new String[]{"image/jpeg", "image/png", "image/gif"}; condition = MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?" + " or " + MediaStore.Images.Media.MIME_TYPE + "=?"; } else { select = new String[]{"image/jpeg", "image/png", "image/webp"}; condition = MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?" + " or " + MediaStore.Images.Media.MIME_TYPE + "=?"; } if (id == FunctionConfig.TYPE_IMAGE) { cursorLoader = new CursorLoader( activity, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION, condition, select, IMAGE_PROJECTION[2] + " DESC"); } else if (id == FunctionConfig.TYPE_VIDEO) { String selection; String selectionArgs[]; if (videoS <= 0) { selection = null; selectionArgs = null; } else { selection = "duration <= ?"; selectionArgs = new String[]{String.valueOf(videoS)}; } cursorLoader = new CursorLoader( activity, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, VIDEO_PROJECTION, selection, selectionArgs, VIDEO_PROJECTION[2] + " DESC"); } return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { try { List<LocalMediaFolder> imageFolders = new ArrayList<LocalMediaFolder>(); LocalMediaFolder allImageFolder = new LocalMediaFolder(); List<LocalMedia> latelyImages = new ArrayList<LocalMedia>(); index = 0; if (data != null) { int count = data.getCount(); if (count > 0) { data.moveToFirst(); do { String path = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[0])); // 如原图路径不存在或者路径存在但文件不存在,就结束当前循环 if (TextUtils.isEmpty(path) || !new File(path).exists()) { continue; } long dateTime = data.getLong(data.getColumnIndexOrThrow(IMAGE_PROJECTION[2])); int duration = (type == FunctionConfig.TYPE_VIDEO ? data.getInt(data.getColumnIndexOrThrow(VIDEO_PROJECTION[4])) : 0); LocalMedia image = new LocalMedia(path, dateTime, duration, type); LocalMediaFolder folder = getImageFolder(path, imageFolders); folder.getImages().add(image); folder.setType(type); index++; folder.setImageNum(folder.getImageNum() + 1); // 最近相册中 只添加最新的100条 if (index <= 100) { latelyImages.add(image); allImageFolder.setType(type); allImageFolder.setImageNum(allImageFolder.getImageNum() + 1); } } while (data.moveToNext()); if (latelyImages.size() > 0) { sortFolder(imageFolders); imageFolders.add(0, allImageFolder); String title = ""; switch (type) { case FunctionConfig.TYPE_VIDEO: title = activity.getString(R.string.picture_lately_video); break; case FunctionConfig.TYPE_IMAGE: title = activity.getString(R.string.picture_lately_image); break; } allImageFolder.setFirstImagePath(latelyImages.get(0).getPath()); allImageFolder.setName(title); allImageFolder.setType(type); allImageFolder.setImages(latelyImages); } imageLoadListener.loadComplete(imageFolders); } else { // 如果没有相册 imageLoadListener.loadComplete(imageFolders); } } } catch (Exception e) { e.printStackTrace(); } } @Override public void onLoaderReset(Loader<Cursor> loader) { } }); } 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); imageFolders.add(newFolder); return newFolder; } public interface LocalMediaLoadListener { void loadComplete(List<LocalMediaFolder> folders); } }