Доступ к заказанным изображениям и видео в том же курсоре

Я использую android.content.CursorLoader класс для создания двух Cursor объекты для доступа к медиафайлам, хранящимся на устройстве пользователя моего приложения. Я хотел бы дать пользователю сетку просмотра их сохраненных изображений и видео, которые сохраняют порядок из приложения галереи Android.

В настоящее время я использую один 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();

1 ответ

Решение

После долгих исследований и игры с исходным кодом я наконец-то стал немного лучше знаком с файловой системой Android. Чтобы получить один Cursor который может получить доступ к информации о обоих Images а также Video Я использовал следующее:

// 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();
Другие вопросы по тегам