2013-07-15 13 views
23

Sto utilizzando la classe android.content.CursorLoader per creare due oggetti Cursor per accedere ai contenuti multimediali memorizzati sull'utente del dispositivo della mia app. Mi piacerebbe dare all'utente una visualizzazione a griglia delle immagini e dei video memorizzati che conserva l'ordine dall'app Galleria Android.Accesso a immagini e video ordinati nello stesso cursore

Attualmente sto utilizzando uno Cursor per accedere a Immagini e uno per accedere a Video. Con questo approccio, tutte le immagini precedono tutti i video (cioè sono in due gruppi separati). C'è un modo per accedere a Immagini e Video dallo stesso Cursor? In caso contrario, c'è un modo migliore per accedere a questi media sul dispositivo?

Per riferimento, ecco il codice che sto usando:

Per Immagini:

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

E Video:

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

risposta

62

Dopo un sacco di ricerca e di giocare con il codice sorgente, Finalmente ho un po 'più di familiarità con il filesystem Android. Per ottenere un singolo Cursor che può accedere alle informazioni sia Images e Video ho usato i seguenti:

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

grazie per condividere il tuo codice finale; questo è stato davvero utile per me! – scientiffic

+0

c'è un problema, stai accedendo all'immagine/ai dati principali ... non alle miniature. Interrogazione su MediaStore.Images.Thumbnails per ogni elemento del cursore è troppo pesante. Qualche idea? – Umair

+0

Come posso visualizzare un'icona di riproduzione sui video? –

Problemi correlati