Use following function to get albums of Video or Images :
/*
*
* Author : @nieldeokar
* mediaType could be one of
*
* public static final int MEDIA_TYPE_IMAGE = 1;
*
* public static final int MEDIA_TYPE_VIDEO = 3;
*
* from android.provider.MediaStore class
*
*/
fun getAlbumList(mediaType: Int, contentResolver: ContentResolver) {
val countColumnName = "count"
var contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
if (mediaType == MEDIA_TYPE_VIDEO) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
}
val projection = arrayOf(ImageColumns.BUCKET_ID, ImageColumns.BUCKET_DISPLAY_NAME, ImageColumns.DATE_TAKEN, ImageColumns.DATA)
val bucketGroupBy = "1) GROUP BY ${ImageColumns.BUCKET_ID}, (${ImageColumns.BUCKET_DISPLAY_NAME}"
val bucketOrderBy = MediaStore.Images.Media.DATE_MODIFIED + " DESC"
val cursor = contentResolver.query(contentUri, projection, bucketGroupBy, null, bucketOrderBy)
if (cursor != null) {
while (cursor.moveToNext()) {
val bucketId = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.BUCKET_ID))
val name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME))
val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA)) // Thumb image path
val selection = MediaStore.Images.Media.BUCKET_ID + "='" + bucketId + "'"
val countCursor = contentResolver.query(contentUri, arrayOf( "count(" + MediaStore.Images.ImageColumns._ID + ")"), selection, null, null)
var count = 0
if (countCursor != null) {
countCursor.moveToFirst()
count = countCursor.getInt(0)
countCursor.close()
}
Log.d("AlbumScanner", "bucketId : $bucketId | name : $name | count : $count | path : $path")
}
cursor.close()
}
}
This forms a SQL Statement as :
SELECT bucket_id, bucket_display_name, datetaken, _data FROM images WHERE (1) GROUP BY bucket_id,(bucket_display_name) ORDER BY date_modified DESC
UPDATE :
As @PerracoLabs pointed out, This code needs to be improved for targeting Android Q.