java - 尝试通过 MediaStore.createDeleteRequest(getContentResolver(), uris) 为 Android R (API 30) 为范围存储创建删除请求的异常
问题描述
尝试使用范围存储以 Android R (API 30) 为目标。我让图像选择器打开媒体库以允许用户使用以下方法选择 1 个或多个图像:
new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
我得到了 Uris 的列表,例如
content://com.android.providers.media.documents/document/image%3A189
content://com.android.providers.media.documents/document/image%3A190
然后,我尝试生成请求删除权限的意图:
PendingIntent intent = MediaStore.createDeleteRequest(getContentResolver(), uris);
但这会引发异常:
java.lang.IllegalArgumentException: All requested items must be referenced by specific ID
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:172)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
at android.content.ContentProviderProxy.call(ContentProviderNative.java:732)
at android.content.ContentResolver.call(ContentResolver.java:2405)
at android.provider.MediaStore.createRequest(MediaStore.java:822)
at android.provider.MediaStore.createDeleteRequest(MediaStore.java:985)
...
如何将 Uris 转换为预期的特殊格式MediaStore.createDeleteRequest
?
解决方案
最后,我通过从返回的 URI 中提取媒体编号重新生成 URI,然后使用:
ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Long.parseLong(num));
创建 MediaStore API 期望的 URI。图像选择器没有返回其他媒体服务所期望的 URI,这似乎很奇怪。
推荐阅读
- javascript - 带有链接的 JavaScript 按钮
- c# - Menu 上的绑定 Items 集合将显示在 MenuItem Popup 上
- google-cloud-dataflow - 数据流作业失败:随机关闭失败:FAILED_PRECONDITION:前提条件检查失败
- kdb - 根据正数或负数更新表值
- python - 如何获取有关 python 错误的更多信息?
- c++ - 导入库问题“导入库格式存档中已识别但未处理的机器类型 (0x8664)”
- facebook - 当请求用户被禁止做的事情时,facebook api 会返回什么?
- amazon-web-services - 恢复 Etcd 法定人数
- javascript - 卡片翻转悬停并单击
- r - 从托管在外部服务器上的 Shiny 应用程序访问本地目录结构?