Я нашел способ получать альбомы без перебора всех фотографий.
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, поэтому, если мы сделаем выбор как
"GROUP BY" + MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME
он будет скомпилирован как "WHERE (GROUP BY bucket_display_name)" и вызовет исключение SQLiteException во время выполнения. В противном случае, если мы сделаем выбор как
"1) GROUP BY (" + MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME
он будет скомпилирован как "WHERE (1) GROUP BY (bucket_display_name)", что является правильным