【问题标题】:Can't update MediaStore on Android 10无法在 Android 10 上更新 MediaStore
【发布时间】:2020-02-23 20:12:43
【问题描述】:

我一直在通过 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 帖子描述了 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 上运行,正确的解决方法是什么?

【问题讨论】:

  • 您是否将 insert() 的内容从这个应用程序导入到 MediaStore 中?还是来自其他应用的内容?
  • 这是设备上所有文件夹(存储桶)中图像的元数据;主要是相机应用。所以,不,不是属于或源自我的应用程序的内容。我知道你要怎么做,这是对 Android 的政策更改,因为这在以前的 Android 版本中运行良好。是否有一些技术解决方法,或者这不再可能?我的想法是,描述“属于”图像。我的应用程序只提供便利,使输入标题变得容易。文本不应该是我的应用程序私有的。
  • 哦,就上下文而言,我的应用程序是一个画廊类型的应用程序,它显示设备上的所有图像并让用户输入描述(标题),它存储在设备上(即在 MediaStore 中)并在 JPEG(EXIF 标签)中。例如,用于制作相册。
  • 就我个人而言,我还没有在新的MediaStore 中尝试过update() 用于其他应用程序创建的内容。我的理解是,尝试这样做会触发RecoverableSecurityException。您可以使用该异常中的详细信息来引发系统 UI,以允许用户授予您执行您尝试执行的任何操作的权限。我以 Google 的 this sample app 为基础写了关于 here 的文章。
  • SDKINT-29:尝试更新应用程序自行创建的文件:问题:java.lang.IllegalArgumentException:内容移动://media/external/file/70 这是' t 部分定义明确的集合不允许

标签: android mediastore android-10.0


【解决方案1】:

好的,在 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 上对此进行了测试。

【讨论】:

  • 还有其他方法可以更新媒体存储中的多行吗?我正在尝试更新标题、艺术家、专辑、专辑封面和流派。
  • 知道为什么这应该起作用吗? stackoverflow.com/a/60152702 显然使用 MediaStore.Audio.Media.IS_PENDING 解决了问题,但不确定这意味着什么。
  • 查看 MediaProvider 实现的 sMutableColumns 以获取 Android Q 中不需要 PENDING 状态的所有列。对于所有其他列,QueryBuilder 需要 PENDING 状态
  • @CodeRed:谢谢!对于其他人,here is the master version of MediaProvider.
  • 尝试更新应用程序自行创建的文件:问题:java.lang.IllegalArgumentException:内容移动://media/external/file/70,这不是很好的一部分- 不允许定义集合
猜你喜欢
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 2020-02-25
  • 1970-01-01
  • 2020-04-10
  • 2020-04-18
  • 2020-09-02
相关资源
最近更新 更多