使用Android自身的LoaderManager
public class MediaStoreHelper {
//所有图片的目录放在第一个位置
public final static int INDEX_ALL_PHOTOS = 0;
//是否查找gif图片
public final static String EXTRA_SHOW_GIF = "SHOW_GIF";
public static void getPhotoDirs(FragmentActivity activity, Bundle args, PhotosResultCallback resultCallback) {
activity.getSupportLoaderManager().initLoader(0, args, new PhotoDirLoaderCallbacks(activity, resultCallback));
}
//LoaderManager的回调
static class PhotoDirLoaderCallbacks implements LoaderManager.LoaderCallbacks<Cursor> {
private WeakReference<Context> context;
private PhotosResultCallback resultCallback;
public PhotoDirLoaderCallbacks(Context context, PhotosResultCallback resultCallback) {
this.context = new WeakReference<>(context);
this.resultCallback = resultCallback;
}
@Override public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new PhotoDirectoryLoader(context.get(), args.getBoolean(EXTRA_SHOW_GIF, false));
}
@Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (data == null) return;
List<PhotoDirectory> directories = new ArrayList<>();
PhotoDirectory photoDirectoryAll = new PhotoDirectory();
photoDirectoryAll.setName(context.get().getString(R.string.publish_all_photo));
photoDirectoryAll.setId("ALL");
while (data.moveToNext()) {
//图片id
int imageId = data.getInt(data.getColumnIndexOrThrow(_ID));
//目录id
String bucketId = data.getString(data.getColumnIndexOrThrow(BUCKET_ID));
//目录名称
String name = data.getString(data.getColumnIndexOrThrow(BUCKET_DISPLAY_NAME));
String path = data.getString(data.getColumnIndexOrThrow(DATA));
PhotoDirectory photoDirectory = new PhotoDirectory();
photoDirectory.setId(bucketId);
photoDirectory.setName(name);
if (!directories.contains(photoDirectory)) {
photoDirectory.setCoverPath(path);
photoDirectory.addPhoto(imageId, path);
photoDirectory.setDateAdded(data.getLong(data.getColumnIndexOrThrow(DATE_ADDED)));
directories.add(photoDirectory);
} else {
directories.get(directories.indexOf(photoDirectory)).addPhoto(imageId, path);
}
photoDirectoryAll.addPhoto(imageId, path);
}
if (photoDirectoryAll.getPhotoPaths().size() > 0) {
photoDirectoryAll.setCoverPath(photoDirectoryAll.getPhotoPaths().get(0));
}
directories.add(INDEX_ALL_PHOTOS, photoDirectoryAll);
if (resultCallback != null) {
resultCallback.onResultCallback(directories);
}
}
@Override public void onLoaderReset(Loader<Cursor> loader) {
}
}
public interface PhotosResultCallback {
void onResultCallback(List<PhotoDirectory> directories);
}
}
具体的查询参数设置
public class PhotoDirectoryLoader extends CursorLoader {
final String[] IMAGE_PROJECTION = {
Media._ID,
Media.DATA,
Media.BUCKET_ID,
Media.BUCKET_DISPLAY_NAME,
Media.DATE_ADDED
};
public PhotoDirectoryLoader(Context context, boolean showGif) {
super(context);
setProjection(IMAGE_PROJECTION);
setUri(Media.EXTERNAL_CONTENT_URI);
setSortOrder(Media.DATE_ADDED + " DESC");
setSelection(
MIME_TYPE + "=? or " + MIME_TYPE + "=? or "+ MIME_TYPE + "=? " + (showGif ? ("or " + MIME_TYPE + "=?") : ""));
String[] selectionArgs;
if (showGif) {
selectionArgs = new String[] { "image/jpeg", "image/png", "image/jpg","image/gif" };
} else {
selectionArgs = new String[] { "image/jpeg", "image/png", "image/jpg" };
}
setSelectionArgs(selectionArgs);
}
}
调用方式
mDirectories = new ArrayList<>();
Bundle mediaStoreArgs = new Bundle();
mediaStoreArgs.putBoolean(MediaStoreHelper.EXTRA_SHOW_GIF, false);
MediaStoreHelper.getPhotoDirs(this, mediaStoreArgs, new MediaStoreHelper.PhotosResultCallback() {
@Override public void onResultCallback(List<PhotoDirectory> dirs) {
mDirectories.clear();
mDirectories.addAll(dirs);
//等目录初始化结束后再添加选中图片所在的目录
for (int i = 0; i < selectPhotoList.size(); i++) {
addSelectDirectories(selectPhotoList.get(i));
}
}
});