Я нашел способ получать альбомы, не перебирая каждую фотографию.
String[] projection = new String[]{
"COUNT(*) as count",
MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
MediaStore.Images.ImageColumns.DATA,
"MAX (" + MediaStore.Images.ImageColumns.DATE_TAKEN + ") as max"};
Context context = ServiceProvider.getInstance().getApplicationContext();
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
"1) GROUP BY (" + MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
null,
"max DESC");
курсор будет содержать столько элементов, сколько существует отдельного имени корзины, а также вы можете получить количество внутри каждой позиции курсора, чтобы получить количество изображений внутри альбома
вот пример:
if (cursor != null) {
if (cursor.moveToFirst()) {
do {
//gets image path, it will always be a latest image because of sortOrdering by MAX date_taken
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
//gets count via alias ("as count" in projection)
int count = cursor.getInt(cursor.getColumnIndex("count"));
//do you logic here
...
} while (cursor.moveToNext());
}
cursor.close();
}
Некоторое объяснение параметра выбора:
contentResolver добавляет круглые скобки при компиляции результирующего запроса для sqlLite, поэтому, если мы сделаем выбор, например
"ГРУППИРОВАТЬ ПО" + MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME
он будет скомпилирован как «WHERE (GROUP BY Bucket_display_name)» и вызовет исключение SQLiteException во время выполнения. В противном случае, если мы сделаем выбор, например
"1) СГРУППИРОВАТЬ ПО (" + MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME
он будет скомпилирован как «WHERE (1) GROUP BY (bucket_display_name)», что правильно
person
Nikita Fedrunov
schedule
19.09.2018