android - 在 Android Q 上查询 MediaStore

标签 android sqlite mediastore android-10.0

我正在使用 MediaStore 获取所有图像专辑,它在 Android Q 之前运行良好。但今天我将编译版本增加到 29,它抛出了这个异常:

android.database.sqlite.SQLiteException: near "GROUP": syntax error (code 1 SQLITE_ERROR): , while compiling: SELECT bucket_id, bucket_display_name, mime_type FROM images WHERE ((is_pending=0) AND (is_trashed=0) AND (volume_name IN ( 'external_primary' ))) AND ( GROUP BY bucket_id )

这是我查询 MediaStore 的代码:

    String[] PROJECTION_BUCKET = {
            MediaStore.Images.ImageColumns.BUCKET_ID,
            MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
            MediaStore.Images.ImageColumns.MIME_TYPE};

    String BUCKET_GROUP_BY = "1) GROUP BY 1,(2";
    String BUCKET_ORDER_BY = "MAX(datetaken) DESC";

    Cursor cur = context.getContentResolver().query(getUriOfType(type),
            PROJECTION_BUCKET,
            BUCKET_GROUP_BY,
            null,
            BUCKET_ORDER_BY);

因为组在 Android Q 中不工作。

有什么解决办法吗?

最佳答案

GROUP BY 不再适用于 android 10(Q),COUNT 也不再适用。 以下代码 fragment 可能对您有所帮助。

String path = null;
String album = null;
String timestamp = null;
String countPhoto = null;
Uri uriExternal = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Uri uriInternal = android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI;
String[] projection = {
        MediaStore.MediaColumns.DATA,
        MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
        MediaStore.MediaColumns.DATE_MODIFIED
};
Cursor cursorExternal = getContentResolver().query(uriExternal, projection, "_data IS NOT NULL", null, null);
Cursor cursorInternal = getContentResolver().query(uriInternal, projection, "_data IS NOT NULL", null, null);
Cursor cursor = new MergeCursor(new Cursor[]{cursorExternal, cursorInternal});
while(cursor.moveToNext()){
    path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA));
    album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME));
    timestamp = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_MODIFIED));
    countPhoto = Function.getCount(getApplicationContext(), album);
    albumOrPhotoList.add(Function.mappingInbox(album, path, timestamp, Function.converToTime(timestamp), countPhoto));
}
cursor.close();
Collections.sort(albumOrPhotoList,new
// Arranging photo album by timestamp decending
MapComparator(Function.KEY_TIMESTAMP, "dsc")); 

关于android - 在 Android Q 上查询 MediaStore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56823336/

相关文章:

java - 如何使用媒体存储加载所有图像?

带代理的 Android Spring RestTemplate

java - 打开和关闭飞行模式以及如何在 android 中打开移动数据

android - 创建一个计时器/处理程序以在 fragment 中每 5 秒获取当前位置?

java - 使用 Firebase Realtime 删除帐户

c++ - 如何在 SQLite 中传递用于触发函数的变量?

mediastore - SDK-29 上的 MediaScanner 和 ScopedStorage

java - 使用哪种 Android 数据存储技术?

java - Android Studio : Add radiobutton string to database

android - 使用 MediaStore android 重命名图像