无法在 Android 10 上更新 MediaStore

问题描述 投票:0回答:2

我一直在通过 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:忽略突变 来自 com.example.android.someapp.app 的描述

这篇 Medium 文章描述了 Google 如何更改用于访问和更新文件的 API,但是仅更新 元数据 又如何呢?该警告似乎告诉我 Google 不再希望允许第三方应用程序使用 MediaStore,而且我还找到了该警告的来源: https://android.googlesource.com/platform/packages/providers/MediaProvider/+/master/src/com/android/providers/media/MediaProvider.java#2960

有谁知道为什么更新在 Android 10 上不起作用,正确的解决方法是什么?

android mediastore android-10.0
2个回答
5
投票

好的,在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
。您可以捕获该信息并引发系统对话框,该对话框应该授予您成功更新此内容的权限。

基本上,决定是否抛出

RecoverableSecurityException
的逻辑取决于
Uri
本身是否具有内容 ID,而不是位于
WHERE
子句中。这样做的一个副作用是,您无法一次修改多个内容,尽管新的 Android R API 可能会有所帮助。

我在 Android 10 和 Android R DP1 上对此进行了测试。


0
投票

创建图像时不要尝试更新 _data 中的值或删除该行:

values.put(MediaStore.Images.Media.DATA, 路径);

© www.soinside.com 2019 - 2024. All rights reserved.