41

我正在使用android.content.CursorLoader该类创建两个Cursor对象来访问存储在我的应用设备用户上的媒体。我想为用户提供他们存储的图像和视频的网格视图,以保留 Android Gallery 应用程序的顺序。

目前我使用一个Cursor访问图像和一个访问视频。使用这种方法,所有图像都在所有视频之前(即它们位于两个单独的组中)。有没有办法同时访问图像和视频Cursor?如果没有,是否有更好的方法来访问设备上的这些媒体?

作为参考,这是我正在使用的代码:

对于图像:

CursorLoader cursorLoader = new CursorLoader(
    mContext,
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    IMAGE_PROJECTION,
    null,
    null,
    MediaStore.Images.Media._ID + " desc"
  );
  mImageCursor = cursorLoader.loadInBackground();

和视频:

CursorLoader cursorLoader = new CursorLoader(
    mContext,
    MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
    VIDEO_PROJECTION,
    null,
    null,
    MediaStore.Video.Media._ID + " desc"
  );
  mVideoCursor = cursorLoader.loadInBackground();
4

1 回答 1

101

经过大量研究和使用源代码后,我终于对 Android 文件系统更加熟悉了。为了获得一个Cursor可以访问两者信息的单曲,ImagesVideo使用了以下内容:

// Get relevant columns for use later.
String[] projection = {
    MediaStore.Files.FileColumns._ID, 
    MediaStore.Files.FileColumns.DATA,
    MediaStore.Files.FileColumns.DATE_ADDED,
    MediaStore.Files.FileColumns.MEDIA_TYPE,
    MediaStore.Files.FileColumns.MIME_TYPE,
    MediaStore.Files.FileColumns.TITLE
};

// Return only video and image metadata.
String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "="
         + MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE 
         + " OR "
         + MediaStore.Files.FileColumns.MEDIA_TYPE + "="
         + MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO;

Uri queryUri = MediaStore.Files.getContentUri("external");

CursorLoader cursorLoader = new CursorLoader(
    this,
    queryUri,
    projection,
    selection,
    null, // Selection args (none).
    MediaStore.Files.FileColumns.DATE_ADDED + " DESC" // Sort order.
  );

Cursor cursor = cursorLoader.loadInBackground();
于 2013-07-16T22:44:06.253 回答