我只想检索桶(相册)的名称。例如。相机,下载等,但不是所有照片中的相机,下载等列表,那么如何为每个存储桶名称检索一行?Android:如何查询桶名称列表
我在画廊应用程序中的意思是,您首先有相册,例如,相机。当你点击它时,它会显示相机的所有照片。
我可以使用查询的Where子句查询Camera Roll中的照片。但是如果我只想要每张专辑名称而不是照片的名称,是否可以查询?如果我查询所有照片并且每组照片只取一行,那么这将是耗时的。
请帮助
我只想检索桶(相册)的名称。例如。相机,下载等,但不是所有照片中的相机,下载等列表,那么如何为每个存储桶名称检索一行?Android:如何查询桶名称列表
我在画廊应用程序中的意思是,您首先有相册,例如,相机。当你点击它时,它会显示相机的所有照片。
我可以使用查询的Where子句查询Camera Roll中的照片。但是如果我只想要每张专辑名称而不是照片的名称,是否可以查询?如果我查询所有照片并且每组照片只取一行,那么这将是耗时的。
请帮助
您可以查询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());
}
我有同样的问题,这里是我的解决方案(跟踪库源代码之后),以获得专辑名称,并在它的第一个图像(可作为缩略图使用这张专辑):
(注那个桶重复由&命令技术删除)
// 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());
}
如何在桶中获取没有照片? – 2015-05-27 11:07:11
不知道,但我收到5.0任何想法重复enteries? – ingsaurabh 2015-11-15 09:18:52
@Krunal Shah我会尝试为每个存储桶运行另一个查询,以筛选where参数中的BUCKET_ID。 – stwienert 2016-05-16 01:28:34
这是它。它为我工作:
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的是含有专辑的最后改性沥青形象的路径,你可以使用它作为缩略图
如何在桶中获取没有照片? – 2015-05-27 11:06:56
不要在如下查询投影:
String bucketProjection[] = {"Distinct "+ MediaStore.Images.Media.BUCKET_DISPLAY_NAME};
显示名称不是唯一标识符(您可以有两个具有相同名称的不同文件夹) - BUCKET_ID是唯一的。如果你想要一个唯一的“文件夹”列表,你将两个名称视为同一个名称 - 因为两个名称相同的存储桶中存在不同的映像。 – 2017-05-23 23:42:47
好,但我只想查询唯一的桶显示名称,而不是重复的桶显示名称的列表。例如。我想要有相机和竞赛专辑。但对于我们的示例代码,它会显示像相机,相机,相机,竞争,竞争等。 – LittleFunny 2012-08-15 05:38:12
是的! 我通过将每个元素添加到HashMap作为关键字来解决此问题。这有点烦人,但它的工作原理。 – 2012-08-17 20:55:13
仍然无法正确解决问题 - 您可以拥有两个具有相同显示名称并具有不同照片的唯一文件夹。 BUCKET_IT是需要成为散列键的关键 - 而不是显示名称。 – 2017-05-23 23:45:01