2012-07-19 13 views
12

Deseo recuperar solo el nombre del contenedor (Álbumes). P.ej. Cámara, Descarga, etc., pero no una lista de Cámara, Descarga, etc. de todas las fotos, entonces, ¿cómo puedo recuperar una fila para cada nombre de depósito?Android: Cómo consultar una lista del nombre del contenedor

Me refiero a la aplicación de la galería, primero tiene álbumes, p. Cámara. Cuando hizo clic en él, muestra todas las fotos de la cámara.

Puedo consultar las fotos en un Camera Roll con la cláusula Where de la consulta. Pero, ¿y si solo quisiera el nombre de cada uno de los álbumes y no las fotos, es posible consultarlo? Si consulto todas las fotos y tomo solo una fila por conjunto de fotos, tomará mucho tiempo.

por favor ayuda

Respuesta

-1

puede consultar MediaStore.Images.Media.BUCKET_DISPLAY_NAME por ello. Peter Knego sent a good example. Es un buen ejemplo y puede actualizarlo utilizando query() de un objeto ContentResolver en lugar de managedQuery() que está en desuso.

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

Bueno, pero solo quiero consultar el nombre único de visualización del depósito en lugar de una lista del nombre repetido para mostrar el cubo. P.ej. Quiero tener algo como álbum de Cámara y Competición. Pero para nuestro código de muestra, se mostrará algo como Cámara, Cámara, Cámara, Competencia, Competencia, etc. – LittleFunny

+1

¡Sí! Lo resolví agregando cada elemento a un HashMap como clave. Es un poco molesto pero funciona. –

+0

Todavía no resuelve el problema correctamente: puede tener dos carpetas únicas que tienen el mismo nombre para mostrar y tienen diferentes fotos. BUCKET_IT es lo que debe ser la clave para un hash, no para mostrar el nombre. –

22

que tienen el mismo problema y aquí está mi solución (después de trazar el código fuente galería) para obtener el nombre del álbum y la primera imagen en ella (se puede utilizar como miniatura de este álbum):

(Nota ese cubo de repetición se elimina por GroupBy técnica & orden)

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

¿Cómo obtener un número de fotos en el cubo? –

+0

No lo sé, pero estoy recibiendo enteros duplicados en 5.0 alguna idea? – ingsaurabh

+0

@Krunal Shah Intentaré ejecutar otra consulta para cada depósito que filtre en BUCKET_ID en el parámetro where. – stwienert

6

Aquí está. funciona para mí:

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 es que contiene los nombres de álbumes

imageURLs Arraylist está conteniendo ruta última imagen modifided del álbum del que se puede utilizar como miniatura

+0

¿Cómo obtener un número de fotos en el cubo? –

-1

hacer la proyección en la consulta de la siguiente manera:

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

El nombre para mostrar no es un identificador único (puede tener dos carpetas diferentes con el mismo nombre): BUCKET_ID es único. Si desea una lista de "carpetas" únicas, trate dos con el mismo nombre que una sola, ya que hay diferentes imágenes en los dos segmentos idénticos. –

Cuestiones relacionadas