2012-07-19 15 views
12

Chcę pobrać tylko nazwę wiadra (Albumy). Na przykład. Aparat, pobieranie itp., Ale nie lista aparatów, pobieranie itp. Ze wszystkich zdjęć, więc w jaki sposób mogę pobrać jeden wiersz dla każdej nazwy wiadra?Android: Jak zapytać o listę nazwy wiadra

Co mam na myśli, tak jak w aplikacji Galeria, masz najpierw albumy, np. Aparat fotograficzny. Po kliknięciu na to pokazuje wszystkie zdjęcia z kamery.

Potrafię wyszukiwać zdjęcia w rolce z aparatu z klauzulem Where zapytania. Ale co, gdybym chciał tylko nazwę każdego z nazw albumów, a nie zdjęcia, czy można o to zapytać? Jeśli wyślę wszystkie zdjęcia i zrobię tylko jeden wiersz na zbiór zdjęć, to będzie to czasochłonne.

proszę o pomoc

Odpowiedz

-1

Można zapytać MediaStore.Images.Media.BUCKET_DISPLAY_NAME dla niego. Peter Knego sent a good example. Jest to dobry przykład i można go zaktualizować za pomocą query() z obiektu ContentResolver, a nie za pomocą metody managedQuery(), która jest przestarzała.

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

Dobre, ale chcę tylko zapytać unikalną nazwę wyświetlaną wiadro zamiast listy powtarzających się nazwy wyświetlanej wiadro. Na przykład. Chcę mieć coś w rodzaju albumu Camera and Competition. Ale w przypadku przykładowego kodu wyświetli się coś w rodzaju kamery, aparatu fotograficznego, kamery, konkurencji, konkursu itp. – LittleFunny

+1

Tak! Rozwiązałem to, dodając każdy element do HashMap jako klucz. To trochę denerwujące, ale działa. –

+0

Nadal nie rozwiązuje problemu poprawnie - możesz mieć dwa unikalne foldery, które mają tę samą nazwę wyświetlaną i mają różne zdjęcia. BUCKET_IT jest tym, co musi być kluczem dla hash - nie wyświetlaj nazwy. –

22

Mam ten sam problem i tutaj jest moje rozwiązanie (po śledzenie kodu źródłowego galeria), aby uzyskać nazwę albumu i pierwszego obrazu w nim (można użyć jako miniatury na tej płycie):

(uwaga że powtórzenie wiadro jest usuwany przez GroupBy techniki & zamówienia)

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

Jak uzyskać brak zdjęć w wiadrze? –

+0

Nie wiem, ale otrzymuję duplikaty Enteries na 5.0 jakichkolwiek pomysłów? – ingsaurabh

+0

@ Krunal Shah Spróbowałbym uruchomić inne zapytanie dla każdego segmentu filtrującego w BUCKET_ID w parametrze where. – stwienert

6

Oto ona. to działa na mnie:

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 jest zawierające nazwy albumów

imageUrls ArrayList jest zawierające ścieżkę ostatniego modifided obraz albumu można go używać jako miniatury

+0

Jak uzyskać brak zdjęć w wiadrze? –

-1

Czy występ w zapytaniu, jak poniżej:

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

Wyświetlana nazwa nie jest unikalnym identyfikatorem (możesz mieć dwa różne foldery o tej samej nazwie) - BUCKET_ID jest unikalny. Jeśli chcesz mieć listę unikalnych "folderów", traktujesz dwie takie same nazwy jak jedna - ponieważ w dwóch identycznie nazwanych zasobnikach znajdują się różne obrazy. –