2012-07-19 11 views
12

バケット(アルバム)の名前のみを取得したいと思います。例えば。カメラ、ダウンロードなどがありますが、カメラのリストはありません。すべての写真からダウンロードしてください。どうすればバケット名ごとに1行ずつ取り出すことができますか?Android:バケット名のリストを照会する方法

ギャラリーアプリケーションでは、まず最初にアルバムがあります。カメラ。クリックすると、カメラのすべての写真が表示されます。

カメラロール内の写真をクエリのWhere句でクエリできます。しかし、写真ではなくアルバムの名前だけを欲しければ、それを照会することは可能でしょうか?私がすべての写真を照会し、1セットの写真につき1つの行だけを取ると、時間がかかるでしょう。

あなたはそれのためにMediaStore.Images.Media.BUCKET_DISPLAY_NAMEを照会することができ

答えて

-1

を助けてください。 Peter Knego sent a good example.これは良い例で、廃止予定のmanagedQuery()ではなくContentResolverオブジェクトからquery()を使用して更新できます。

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

いいえ、繰り返しバケット表示名のリストではなく、一意のバケット表示名を照会したいだけです。例えば。私はカメラとコンクールのアルバムのようなものを持っていたい。しかし、URのサンプルコードでは、カメラ、カメラ、カメラ、競技会、競技会などのようなものが表示されます。 – LittleFunny

+1

はい! 私はキーとして各要素をHashMapに追加することでこれを解決しました。ちょっと迷惑ですが、うまくいきます。 –

+0

それでも問題は正しく解決されません。表示名が同じで写真が異なる2つの一意のフォルダを持つことができます。 BUCKET_ITは、表示名ではなく、ハッシュのキーでなければならないものです。 –

22

私は同じ問題を抱えているし、ここに私の解決策は、(このアルバムのサムネイルとして使用することができます)、その中にアルバム名と最初の画像を取得する(ギャラリーのソースコードをトレースした後)である:

(注バケット反復はgroupby &オーダーテクニックによって削除されます)

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

バケットで写真を撮る方法は? –

+0

知っていませんが、私は5.0のアイデアを重複して受け取っていますか? – ingsaurabh

+0

@ Krunal Shah whereパラメータでBUCKET_IDをフィルタリングする各バケットに対して別のクエリを実行しようとします。 – stwienert

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を含むされたアルバム名

ArrayListのは、アルバムの最後modifided画像のパスを含むされ、あなたがサムネイルとして使用することができ

imageUrls

+0

バケットで写真を撮る方法は? –

-1

次のようにクエリの投影を行います。

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

表示名は一意の識別子ではありません(同じ名前の2つの異なるフォルダを持つことができます).BUCKET_IDは一意です。一意の「フォルダ」のリストが必要な場合は、2つの同じ名前のバケットに異なるイメージがあるため、2つの名前を1つの名前と同じ名前として扱います。 –

関連する問題