无法在 Android 10 上更新 MediaStore
Can't update MediaStore on Android 10
我一直在通过 ContentResolver 更新 MediaStore 中的元数据,但这不再适用于 Android Q (API 29)。下面的代码给我一个警告,描述没有更新:
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DESCRIPTION, "Some text");
int res = getContext().getContentResolver().update(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values,
MediaStore.Images.Media._ID + "= ?", new String[]{sImageId});
android.process.media W/MediaProvider: Ignoring mutation of
description from com.example.android.someapp.app
这个媒体 post 描述了 how Google has changed the API for accessing and updating files,但是只更新 元数据 呢?警告似乎告诉我 Google 不再允许第三方应用程序使用 MediaStore,我也找到了警告的来源:
https://android.googlesource.com/platform/packages/providers/MediaProvider/+/master/src/com/android/providers/media/MediaProvider.java#2960
有谁知道为什么更新在 Android 10 上不起作用,正确的解决方法是什么?
好的,在joakimk的帮助下,我找到了问题
要更新单个内容,您需要使用指向该单个内容的 Uri
:
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DESCRIPTION, text);
Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imgId);
int res = getContentResolver().update(uri, values, null, null);
这种形式的 update()
将抛出一个 RecoverableSecurityException
。你可以抓住那个 raise a system dialog 应该给你成功更新此内容的权限。
基本上,决定是否抛出 RecoverableSecurityException
的逻辑取决于 Uri
本身具有内容的 ID,而不是它在 WHERE
子句中。这样做的副作用是您一次不能修改多个内容,尽管新的 Android R API 可能会有所帮助。
我在 Android 10 和 Android R DP1 上测试了这个。
我一直在通过 ContentResolver 更新 MediaStore 中的元数据,但这不再适用于 Android Q (API 29)。下面的代码给我一个警告,描述没有更新:
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DESCRIPTION, "Some text");
int res = getContext().getContentResolver().update(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values,
MediaStore.Images.Media._ID + "= ?", new String[]{sImageId});
android.process.media W/MediaProvider: Ignoring mutation of description from com.example.android.someapp.app
这个媒体 post 描述了 how Google has changed the API for accessing and updating files,但是只更新 元数据 呢?警告似乎告诉我 Google 不再允许第三方应用程序使用 MediaStore,我也找到了警告的来源: https://android.googlesource.com/platform/packages/providers/MediaProvider/+/master/src/com/android/providers/media/MediaProvider.java#2960
有谁知道为什么更新在 Android 10 上不起作用,正确的解决方法是什么?
好的,在joakimk的帮助下,我找到了问题
要更新单个内容,您需要使用指向该单个内容的 Uri
:
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DESCRIPTION, text);
Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imgId);
int res = getContentResolver().update(uri, values, null, null);
这种形式的 update()
将抛出一个 RecoverableSecurityException
。你可以抓住那个 raise a system dialog 应该给你成功更新此内容的权限。
基本上,决定是否抛出 RecoverableSecurityException
的逻辑取决于 Uri
本身具有内容的 ID,而不是它在 WHERE
子句中。这样做的副作用是您一次不能修改多个内容,尽管新的 Android R API 可能会有所帮助。
我在 Android 10 和 Android R DP1 上测试了这个。