2012-07-19 75 views
12

我只想檢索桶(相冊)的名稱。例如。相機,下載等,但不是所有照片中的相機,下載等列表,那麼如何爲每個存儲桶名稱檢索一行?Android:如何查詢桶名稱列表

我在畫廊應用程序中的意思是,您首先有相冊,例如,相機。當你點擊它時,它會顯示相機的所有照片。

我可以使用查詢的Where子句查詢Camera Roll中的照片。但是如果我只想要每張專輯名稱而不是照片的名稱,是否可以查詢?如果我查詢所有照片並且每組照片只取一行,那麼這將是耗時的。

請幫助

回答

-1

您可以查詢MediaStore.Images.Media.BUCKET_DISPLAY_NAME它。 Peter Knego sent a good example.這是一個很好的例子,您可以使用ContentResolver對象的query()而不是棄用的managedQuery()來更新它。

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

好,但我只想查詢唯一的桶顯示名稱,而不是重複的桶顯示名稱的列表。例如。我想要有相機和競賽專輯。但對於我們的示例代碼,它會顯示像相機,相機,相機,競爭,競爭等。 – LittleFunny 2012-08-15 05:38:12

+1

是的! 我通過將每個元素添加到HashMap作爲關鍵字來解決此問題。這有點煩人,但它的工作原理。 – 2012-08-17 20:55:13

+0

仍然無法正確解決問題 - 您可以擁有兩個具有相同顯示名稱並具有不同照片的唯一文件夾。 BUCKET_IT是需要成爲散列鍵的關鍵 - 而不是顯示名稱。 – 2017-05-23 23:45:01

22

我有同樣的問題,這裏是我的解決方案(跟蹤庫源代碼之後),以獲得專輯名稱,並在它的第一個圖像(可作爲縮略圖使用這張專輯):

(注那個桶重複由&命令技術刪除)

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

如何在桶中獲取沒有照片? – 2015-05-27 11:07:11

+0

不知道,但我收到5.0任何想法重複enteries? – ingsaurabh 2015-11-15 09:18:52

+0

@Krunal Shah我會嘗試爲每個存儲桶運行另一個查詢,以篩選where參數中的BUCKET_ID。 – stwienert 2016-05-16 01:28:34

6

這是它。它爲我工作:

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的是含有專輯名稱

imageUrls ArrayList的是含有專輯的最後改性瀝青形象的路徑,你可以使用它作爲縮略圖

+0

如何在桶中獲取沒有照片? – 2015-05-27 11:06:56

-1

不要在如下查詢投影:

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

顯示名稱不是唯一標識符(您可以有兩個具有相同名稱的不同文件夾) - BUCKET_ID是唯一的。如果你想要一個唯一的「文件夾」列表,你將兩個名稱視爲同一個名稱 - 因爲兩個名稱相同的存儲桶中存在不同的映像。 – 2017-05-23 23:42:47