2013-07-15 7 views
23

Ich verwende die Klasse android.content.CursorLoader, um zwei Cursor Objekte für den Zugriff auf Medien zu erstellen, die auf dem Gerät meiner App gespeichert sind. Ich möchte dem Nutzer eine Rasteransicht seiner gespeicherten Bilder und Videos geben, die die Reihenfolge in der Android-Galerie-App erhalten.Zugriff auf geordnete Bilder und Videos in demselben Cursor

Momentan verwende ich einen Cursor, um auf Bilder zuzugreifen und einen, um auf Video zuzugreifen. Bei diesem Ansatz gehen alle Bilder allen Videos voraus (d.h. sie sind in zwei getrennten Gruppen). Gibt es eine Möglichkeit, auf Bilder und Videos von demselben Cursor zuzugreifen? Wenn nicht, gibt es eine bessere Möglichkeit, auf diese Medien auf dem Gerät zuzugreifen?

Als Referenz hier ist der Code Ich verwende:

Für Bilder:

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

und Video:

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

Antwort

62

Nach viel Forschung und Herumspielen mit Quellcode, Ich bin schließlich ein bisschen vertrauter mit dem Android-Dateisystem. Um einen einzelnen Cursor zu erhalten, die sowohl Informationen über Images zugreifen und Video benutzte ich die folgenden:

// 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

Dank für Ihre endgültige Code-Sharing; Das war sehr hilfreich für mich! – scientiffic

+0

Es gibt ein Problem, Sie greifen auf das Hauptbild/die Daten zu .. nicht auf die Miniaturansichten. Das Abfragen von MediaStore.Images.Thumbnails für jedes Cursor-Element ist zu schwer. Irgendwelche Ideen? – Umair

+0

Wie kann ich ein Wiedergabesymbol in Videos anzeigen? –

Verwandte Themen