web-dev-qa-db-ja.com

同じカーソルで注文した画像とビデオにアクセスする

Android.content.CursorLoaderクラスを使用して2つのCursorオブジェクトを作成し、アプリのデバイスのユーザーに保存されているメディアにアクセスしています。 Androidギャラリーアプリからの順序を維持する、保存された画像とビデオのグリッドビューをユーザーに提供したい.

現在、1つのCursorを使用して画像にアクセスし、もう1つを使用してビデオにアクセスしています。このアプローチでは、すべての画像がすべての動画に先行します(つまり、2つの別々のグループに属します)。同じ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();
32
Cam

たくさんの調査とソースコードの操作を経て、ようやく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();
73
Cam