add alternative media query syntax for Android 11

This commit is contained in:
Wenqi Li 2021-01-12 16:49:53 +08:00
parent a44d9da2ea
commit af598888b8

View File

@ -284,13 +284,48 @@ class PhotoGalleryPlugin : FlutterPlugin, MethodCallHandler {
val limit = take ?: (total - offset)
this.context?.run {
val imageCursor = this.contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
imageMetadataProjection,
if (albumId == allAlbumId) null else "${MediaStore.Images.Media.BUCKET_ID} = $albumId",
null,
"$imageOrderBy LIMIT $limit OFFSET $offset"
)
val imageCursor: Cursor?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
imageCursor = this.contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
imageMetadataProjection,
android.os.Bundle().apply {
// Limit & Offset
putInt(android.content.ContentResolver.QUERY_ARG_LIMIT, limit)
putInt(android.content.ContentResolver.QUERY_ARG_OFFSET, offset)
// Sort
putStringArray(
android.content.ContentResolver.QUERY_ARG_SORT_COLUMNS,
arrayOf(
MediaStore.Images.Media.DATE_TAKEN,
MediaStore.Images.Media.DATE_MODIFIED
)
)
putIntArray(
android.content.ContentResolver.QUERY_ARG_SORT_DIRECTION,
intArrayOf(
android.content.ContentResolver.QUERY_SORT_DIRECTION_DESCENDING,
android.content.ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
)
)
// Selection
if (albumId != allAlbumId) {
putString(android.content.ContentResolver.QUERY_ARG_SQL_SELECTION, "${MediaStore.Images.Media.BUCKET_ID} = ?")
putStringArray(android.content.ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, arrayOf(albumId))
}
},
null
)
} else {
imageCursor = this.contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
imageMetadataProjection,
if (albumId == allAlbumId) null else "${MediaStore.Images.Media.BUCKET_ID} = $albumId",
null,
"$imageOrderBy LIMIT $limit OFFSET $offset"
)
}
imageCursor?.use { cursor ->
while (cursor.moveToNext()) {
@ -312,12 +347,48 @@ class PhotoGalleryPlugin : FlutterPlugin, MethodCallHandler {
val limit = take ?: (total - offset)
this.context?.run {
val videoCursor = this.contentResolver.query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
videoMetadataProjection,
if (albumId == allAlbumId) null else "${MediaStore.Images.Media.BUCKET_ID} = $albumId",
null,
"$videoOrderBy LIMIT $limit OFFSET $offset")
val videoCursor: Cursor?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
videoCursor = this.contentResolver.query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
videoMetadataProjection,
android.os.Bundle().apply {
// Limit & Offset
putInt(android.content.ContentResolver.QUERY_ARG_LIMIT, limit)
putInt(android.content.ContentResolver.QUERY_ARG_OFFSET, offset)
// Sort
putStringArray(
android.content.ContentResolver.QUERY_ARG_SORT_COLUMNS,
arrayOf(
MediaStore.Video.Media.DATE_TAKEN,
MediaStore.Video.Media.DATE_MODIFIED
)
)
putIntArray(
android.content.ContentResolver.QUERY_ARG_SORT_DIRECTION,
intArrayOf(
android.content.ContentResolver.QUERY_SORT_DIRECTION_DESCENDING,
android.content.ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
)
)
// Selection
if (albumId != allAlbumId) {
putString(android.content.ContentResolver.QUERY_ARG_SQL_SELECTION, "${MediaStore.Video.Media.BUCKET_ID} = ?")
putStringArray(android.content.ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, arrayOf(albumId))
}
},
null
)
} else {
videoCursor = this.contentResolver.query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
videoMetadataProjection,
if (albumId == allAlbumId) null else "${MediaStore.Video.Media.BUCKET_ID} = $albumId",
null,
"$videoOrderBy LIMIT $limit OFFSET $offset"
)
}
videoCursor?.use { cursor ->
while (cursor.moveToNext()) {
@ -486,13 +557,48 @@ class PhotoGalleryPlugin : FlutterPlugin, MethodCallHandler {
private fun getImageAlbumThumbnail(albumId: String, width: Int?, height: Int?): ByteArray? {
return this.context?.run {
val imageCursor = this.contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
arrayOf(MediaStore.Images.Media._ID),
if (albumId == allAlbumId) null else "${MediaStore.Images.Media.BUCKET_ID} = $albumId",
null,
MediaStore.Images.Media.DATE_TAKEN + " DESC LIMIT 1"
)
val imageCursor: Cursor?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
imageCursor = this.contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
arrayOf(MediaStore.Images.Media._ID),
android.os.Bundle().apply {
// Limit
putInt(android.content.ContentResolver.QUERY_ARG_LIMIT, 1)
// Sort
putStringArray(
android.content.ContentResolver.QUERY_ARG_SORT_COLUMNS,
arrayOf(
MediaStore.Images.Media.DATE_TAKEN,
MediaStore.Images.Media.DATE_MODIFIED
)
)
putIntArray(
android.content.ContentResolver.QUERY_ARG_SORT_DIRECTION,
intArrayOf(
android.content.ContentResolver.QUERY_SORT_DIRECTION_DESCENDING,
android.content.ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
)
)
// Selection
if (albumId != allAlbumId) {
putString(android.content.ContentResolver.QUERY_ARG_SQL_SELECTION, "${MediaStore.Images.Media.BUCKET_ID} = ?")
putStringArray(android.content.ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, arrayOf(albumId))
}
},
null
)
} else {
imageCursor = this.contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
arrayOf(MediaStore.Images.Media._ID),
if (albumId == allAlbumId) null else "${MediaStore.Images.Media.BUCKET_ID} = $albumId",
null,
MediaStore.Images.Media.DATE_TAKEN + " DESC LIMIT 1"
)
}
imageCursor?.use { cursor ->
if (cursor.moveToFirst()) {
val idColumn = cursor.getColumnIndex(MediaStore.Images.Media._ID)
@ -507,13 +613,48 @@ class PhotoGalleryPlugin : FlutterPlugin, MethodCallHandler {
private fun getVideoAlbumThumbnail(albumId: String, width: Int?, height: Int?): ByteArray? {
return this.context?.run {
val videoCursor = this.contentResolver.query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
arrayOf(MediaStore.Video.Media._ID),
if (albumId == allAlbumId) null else "${MediaStore.Video.Media.BUCKET_ID} = $albumId",
null,
MediaStore.Video.Media.DATE_TAKEN + " DESC LIMIT 1"
)
val videoCursor: Cursor?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
videoCursor = this.contentResolver.query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
arrayOf(MediaStore.Video.Media._ID),
android.os.Bundle().apply {
// Limit
putInt(android.content.ContentResolver.QUERY_ARG_LIMIT, 1)
// Sort
putStringArray(
android.content.ContentResolver.QUERY_ARG_SORT_COLUMNS,
arrayOf(
MediaStore.Video.Media.DATE_TAKEN,
MediaStore.Video.Media.DATE_MODIFIED
)
)
putIntArray(
android.content.ContentResolver.QUERY_ARG_SORT_DIRECTION,
intArrayOf(
android.content.ContentResolver.QUERY_SORT_DIRECTION_DESCENDING,
android.content.ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
)
)
// Selection
if (albumId != allAlbumId) {
putString(android.content.ContentResolver.QUERY_ARG_SQL_SELECTION, "${MediaStore.Video.Media.BUCKET_ID} = ?")
putStringArray(android.content.ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, arrayOf(albumId))
}
},
null
)
} else {
videoCursor = this.contentResolver.query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
arrayOf(MediaStore.Video.Media._ID),
if (albumId == allAlbumId) null else "${MediaStore.Video.Media.BUCKET_ID} = $albumId",
null,
MediaStore.Video.Media.DATE_TAKEN + " DESC LIMIT 1"
)
}
videoCursor?.use { cursor ->
if (cursor.moveToNext()) {
val idColumn = cursor.getColumnIndex(MediaStore.Video.Media._ID)