无法在 Android 10 上更新 MediaStore

2023-11-22

我一直在通过 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 的描述

这篇中等文章描述了Google 如何更改用于访问和更新文件的 API,但是如果只更新元数据?该警告似乎告诉我 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。你可以抓住它并且引发系统对话框这应该会授予您成功更新此内容的权限。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 Android 10 上更新 MediaStore 的相关文章

随机推荐

  • exec() 和 phantomjs 的绝对路径问题

    我在用着幻影JS用于以编程方式截取网页屏幕截图的目的 我的网络服务器在 Linux 64 位上运行 场景 My test php file exec phantomjs version o e print r o echo e I open
  • 对“kill”的未定义引用

    我用 C 语言为 ARM7 嵌入式系统开发了一个应用程序 现在我想用 C 编译并链接它 以便使用一些 C 功能 为此 我正在使用mipsel elf g 代替mipsel elf gcc 我可以用以下命令编译我的代码mipsel elf g
  • 为什么 ng-hide 不适用于自定义指令?

    我正在阅读 angularjs org 上的开发人员指南的指令部分 以刷新我的知识并获得一些见解 我试图运行其中一个示例 但指令 ng hide 不适用于自定义指令 这里是jsfiddle http jsfiddle net D3Nsk
  • 如何在 iOS 模拟器中测试动态类型(较大字体)

    可以手动更改 iOS 中的动态类型设置 设置 gt 常规 gt 辅助功能 gt 较大文本 但这似乎在当前的模拟器 撰写本文时为 v9 3 中不起作用 并且手动执行此操作并不是需要自动化的解决方案 问题 有没有办法启动具有动态类型设置的应用程
  • Silverlight构造函数注入视图模型+设计模式

    我正在尝试在 Silverlight 4 中编写可测试的 ViewModel 我目前使用 MVVM light 我使用 AutoFac IoCContainer 做得很好 但是 要注入绑定到视图的 ViewModel 的构造函数 我有以下构
  • java 使用套接字发送文件

    我正在尝试使用 Java 将文件从一台计算机发送到另一台计算机 我编写了下面的代码 如果发送方和接收方都在同一台计算机上启动 则它可以正常工作 但如果它们在不同的计算机上工作 则接收到的文件大小比原始文件大并且已损坏 注意 我正在尝试传输最
  • 没有参数的模板类“template<>”是什么意思?

    不带参数的模板类是什么意思 例如 我们采用一个计算阶乘的模板类 其模板参数为 N N 基本上 这是一个类 template
  • 开始使用 PM2 时如何将生产模式添加到 sailsjs 应用程序

    要在生产模式下启动 sailsjs 您需要附加 prod Run node app js prod 我使用 PM2 和一个简单的 json 文件进行设置 其中包含进程名称和脚本名称 以启动节点进程 我如何使用 PM2 传递生产参数 Read
  • 使用 JavaScript 的 FileReader 接口检测文件的内容类型

    我一直在为 Web 应用程序中的纯文本文件设置导入脚本 我的脚本如下 function dataImport files confirm Are you sure you want to import the selected file T
  • 如何从字符串traceid创建opentelemetry范围

    我知道我们要使用上下文传播来获取作为彼此子级创建的父级 Traceid 和 Span 但我的发布者正在使用标头 nats 不是 http 我的消息代理使用标头 我将traceid和spanid设置为出站请求中的标头 发送消息 然后订阅者应该
  • 使用 FOR XML 进行行串联,但具有多个列?

    我经常使用如下查询 SELECT FROM ThisTable OUTER APPLY SELECT SELECT SomeField AS data FROM SomeTable WHERE SomeTable ID ThisTable
  • XNA - 同时创建大量粒子

    是时候提出另一个 XNA 问题了 这次纯粹是从技术设计的角度来看 我的情况是这样的 我创建了一个基于 GPU 计算的粒子引擎 虽然远未完成 但它可以工作 我的 GPU 可以毫不费力地轻松处理 10k 个粒子 如果我可以添加更多粒子 我也不会
  • OpenCV:在 Python 中从 NumPy 转换为 IplImage

    我有一个使用 cv2 imread 加载的图像 这将返回一个 NumPy 数组 但是 我需要将其传递到需要 IplImage 格式的数据的第 3 方 API 我已经搜索了我能搜索到的所有内容 找到了从 IplImage 转换为 CvMat
  • 如果孩子不存在,则删除父记录

    我正在表变量中创建菜单和子菜单 典型的同表父子记录 对于所有顶部菜单 ParentID coll 均为空 对于他们的子菜单 ParentID 将是这些父菜单的 MenuId 取决于构建的用户日志类型 现在我要做的是 如果特定父级没有任何子级
  • Jackson,序列化引用的一个属性

    当序列化具有其他对象引用的Java对象时 我只需要序列化嵌套对象的一个 属性 通常是外键 因此序列化对象引用的 id 属性 英戈尔其他一切 例如 我有两个类需要序列化为 JSON 和 XML 为了清楚起见 删除了 JPA 注释 关系 用户
  • Highcharts - 即使没有数据,也强制显示 x 轴中的类别

    我想知道是否有一种方法可以强制 Highcharts 显示传递到其 x 轴的所有类别 而不提供填充数据以使其正常工作 例如 http jsfiddle net cbargren Sdnqu 指定了 3 个额外的 x 轴类别 foo bar
  • 修改pandas条形图的图例

    当我用熊猫制作条形图并且想更改图例中标签的名称时 我总是很烦恼 例如考虑以下代码的输出 import pandas as pd from matplotlib pyplot import df pd DataFrame A 26 B 20
  • 如何确定 PropertyType 是否为外键

    我有以下用 EF 生成的类 schakeling 代表数据库表 schakeling 在数据库中 id 是主键 plc id 是外键 public partial class schakeling public schakeling thi
  • 在源代码管理中存储第三方库

    应用程序依赖的库是否应该存储在源代码管理中 我的一部分说应该 另一部分则说不 添加一个 20mb 的库会让整个应用程序相形见绌 只是因为您依赖其中的几个功能 尽管相当严重 这感觉是错误的 您应该只存储项目的 jar dll 甚至分布式 zi
  • 无法在 Android 10 上更新 MediaStore

    我一直在通过 ContentResolver 更新 MediaStore 中的元数据 但这不再适用于 Android Q API 29 下面的代码给了我一个警告 并且描述没有更新 ContentValues values new Conte