2013-07-15 16 views
23

Używam klasy android.content.CursorLoader do tworzenia dwóch obiektów Cursor w celu uzyskania dostępu do multimediów przechowywanych na urządzeniu użytkownika mojej aplikacji. Chciałbym przekazać użytkownikowi widok siatki przechowywanych obrazów i wideo, który zachowuje porządek w aplikacji Galeria na Androida.Dostęp do zamówionych zdjęć i filmów w tym samym kursorze

Obecnie używam jednego Cursor, aby uzyskać dostęp do obrazów i jednego, aby uzyskać dostęp do wideo. Dzięki takiemu podejściu wszystkie obrazy poprzedzają wszystkie filmy (tj. Są w dwóch osobnych grupach). Czy istnieje sposób dostępu do obrazów i wideo z tego samego Cursor? Jeśli nie, czy jest lepszy sposób dostępu do tych mediów na urządzeniu?

Dla porównania, tutaj jest kod używam:

dla obrazów:

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

i video:

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

Odpowiedz

62

Po wielu badań i odtwarzanie z kodem źródłowym, W końcu trochę lepiej poznałem system plików Android. Aby uzyskać pojedynczy Cursor które mają dostęp do informacji na temat zarówno Images i Video użyłem następujące:

// 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(); 
+4

dzięki za dzielenie się swoją ostateczną kod; to było dla mnie naprawdę pomocne! – scientiffic

+0

Wystąpił problem, użytkownik uzyskuje dostęp do głównego obrazu/danych .. nie do miniatur. Zapytanie MediaStore.Images.Thumbnails dla każdego kursora jest zbyt ciężki. Jakieś pomysły? – Umair

+0

Jak mogę wyświetlić ikonę odtwarzania w filmach? –

Powiązane problemy