2012-07-19 11 views
12

Desidero recuperare solo il nome del bucket (album). Per esempio. Fotocamera, Download ecc. Ma non un elenco di Fotocamera, Download ecc. Da tutte le foto, quindi come faccio a recuperare una riga per ogni nome di bucket?Android: come richiedere un elenco di nome bucket

Cosa intendo nell'applicazione Galleria, per prima cosa hai album, ad es. Telecamera. Quando hai cliccato su di esso, mostra tutte le foto della fotocamera.

Posso interrogare le foto in un Rullino fotografico con la clausola Where della query. Ma se volessi solo il nome di ciascun nome degli album e non le foto, è possibile interrogarlo? Se chiedo tutte le foto e faccio solo una riga per set di foto, allora richiederà molto tempo.

si prega di aiuto

risposta

-1

è possibile interrogare MediaStore.Images.Media.BUCKET_DISPLAY_NAME per esso. Peter Knego sent a good example. È un buon esempio e puoi aggiornarlo usando query() da un oggetto ContentResolver piuttosto che da managedQuery() che è deprecato.

// which image properties are we querying 
String[] projection = new String[]{ 
     MediaStore.Images.Media._ID, 
     MediaStore.Images.Media.BUCKET_DISPLAY_NAME, 
     MediaStore.Images.Media.DATE_TAKEN 
}; 

// Get the base URI for the People table in the Contacts content provider. 
Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 

// Make the query. 
ContentResolver cr = getContentResolver(); 
Cursor cur = cr.query(images, 
     projection, // Which columns to return 
     "",   // Which rows to return (all rows) 
     null,  // Selection arguments (none) 
     ""   // Ordering 
     ); 

Log.i("ListingImages"," query count="+cur.getCount()); 

if (cur.moveToFirst()) { 
    String bucket; 
    String date; 
    int bucketColumn = cur.getColumnIndex(
     MediaStore.Images.Media.BUCKET_DISPLAY_NAME); 

    int dateColumn = cur.getColumnIndex(
     MediaStore.Images.Media.DATE_TAKEN); 

    do { 
     // Get the field values 
     bucket = cur.getString(bucketColumn); 
     date = cur.getString(dateColumn); 

     // Do something with the values. 
     Log.i("ListingImages", " bucket=" + bucket 
       + " date_taken=" + date); 
    } while (cur.moveToNext()); 

} 
+0

Buono ma voglio solo interrogare il nome di visualizzazione del bucket unico invece di un elenco di nome di visualizzazione del bucket ripetuto. Per esempio. Voglio avere qualcosa come album Camera e Concorso. Ma per il codice di esempio mostrerà qualcosa come fotocamera, macchina fotografica, macchina fotografica, competizione, concorrenza ecc. – LittleFunny

+1

Sì! Ho risolto questo aggiungendo ogni elemento a una HashMap come chiave. È un po 'fastidioso ma funziona. –

+0

Ancora non risolve il problema correttamente: puoi avere due cartelle Univoche che hanno lo stesso nome visualizzato e hanno foto diverse. BUCKET_IT è ciò che deve essere la chiave per un hash, non il nome visualizzato. –

22

Ho lo stesso problema e qui è la mia soluzione (dopo aver tracciato il codice sorgente galleria) per ottenere il nome dell'album e la prima immagine in esso (può usare come anteprima per questo album):

(Nota che si ripetono bucket viene rimosso mediante groupby tecnica & ordine)

// which image properties are we querying 
    String[] PROJECTION_BUCKET = { 
      ImageColumns.BUCKET_ID, 
      ImageColumns.BUCKET_DISPLAY_NAME, 
      ImageColumns.DATE_TAKEN, 
      ImageColumns.DATA}; 
    // We want to order the albums by reverse chronological order. We abuse the 
    // "WHERE" parameter to insert a "GROUP BY" clause into the SQL statement. 
    // The template for "WHERE" parameter is like: 
    // SELECT ... FROM ... WHERE (%s) 
    // and we make it look like: 
    // SELECT ... FROM ... WHERE (1) GROUP BY 1,(2) 
    // The "(1)" means true. The "1,(2)" means the first two columns specified 
    // after SELECT. Note that because there is a ")" in the template, we use 
    // "(2" to match it. 
    String BUCKET_GROUP_BY = 
      "1) GROUP BY 1,(2"; 
    String BUCKET_ORDER_BY = "MAX(datetaken) DESC"; 

    // Get the base URI for the People table in the Contacts content provider. 
    Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 

    Cursor cur = getContentResolver().query(
      images, PROJECTION_BUCKET, BUCKET_GROUP_BY, null, BUCKET_ORDER_BY); 

    Log.i("ListingImages"," query count=" + cur.getCount()); 

    if (cur.moveToFirst()) { 
     String bucket; 
     String date; 
     String data; 
     int bucketColumn = cur.getColumnIndex(
       MediaStore.Images.Media.BUCKET_DISPLAY_NAME); 

     int dateColumn = cur.getColumnIndex(
       MediaStore.Images.Media.DATE_TAKEN); 
     int dataColumn = cur.getColumnIndex(
       MediaStore.Images.Media.DATA); 

     do { 
      // Get the field values 
      bucket = cur.getString(bucketColumn); 
      date = cur.getString(dateColumn); 
      data = cur.getString(dataColumn); 

      // Do something with the values. 
      Log.i("ListingImages", " bucket=" + bucket 
        + " date_taken=" + date 
        + " _data=" + data); 
     } while (cur.moveToNext()); 
    } 
+1

Come ottenere le foto nel secchio? –

+0

Non lo so, ma sto ricevendo enteries duplicati su 5.0 qualche idea? – ingsaurabh

+0

@Krunal Shah Vorrei provare a eseguire un'altra query per ciascun bucket che filtra su BUCKET_ID nel parametro where. – stwienert

6

Ecco. funziona per me:

Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
    String[] projection = new String[]{ 
      MediaStore.Images.Media.BUCKET_ID, 
      MediaStore.Images.Media.BUCKET_DISPLAY_NAME, 
      MediaStore.Images.Media.DATE_TAKEN, 
      MediaStore.Images.Media.DATA 
    }; 

    String BUCKET_ORDER_BY = MediaStore.Images.Media.DATE_MODIFIED + " DESC"; 
    String BUCKET_GROUP_BY = "1) GROUP BY 1,(2"; 
    Cursor imagecursor = managedQuery(images, 
      projection, // Which columns to return 
      BUCKET_GROUP_BY,  // Which rows to return (all rows) 
      null,  // Selection arguments (none) 
      BUCKET_ORDER_BY  // Ordering 
      ); 

    this.imageUrls = new ArrayList<String>(); 
    this.imageBuckets = new ArrayList<String>(); 
    for (int i = 0; i < imagecursor.getCount(); i++) 
    { 
     imagecursor.moveToPosition(i); 
     int bucketColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); 
     String bucketDisplayName = imagecursor.getString(bucketColumnIndex); 
     imageBuckets.add(bucketDisplayName); 
     int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA); 
     imageUrls.add(imagecursor.getString(dataColumnIndex)); 

    } 

imageBuckets Arraylist è che contiene i nomi degli album

imageURLs Arraylist è che contiene percorso ultima immagine modifided di album si può utilizzare come miniatura

+0

Come ottenere le foto nel secchio? –

-1

fare proiezione nella query come di seguito:

String bucketProjection[] = {"Distinct "+ MediaStore.Images.Media.BUCKET_DISPLAY_NAME}; 
+0

Il nome visualizzato non è un identificatore univoco (è possibile avere due cartelle diverse con lo stesso nome) - il BUCKET_ID è univoco. Se si desidera un elenco di "cartelle" univoche, si considerano due lo stesso nome di una: poiché vi sono immagini diverse nei due bucket identici. –

Problemi correlati