在 Android R (API 30) 的分区存储中,尝试通过 MediaStore.createDeleteRequest(getContentResolver(), uris) 创建删除请求时出现异常。

4

试图使用范围存储(scoped storage)来针对 Android R(API 30)进行开发。使用以下代码打开媒体库的图片选择器,以允许用户选择一个或多个图像:

new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

我获得了Uri列表,例如:

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)
    ...

如何将Uri转换为MediaStore.createDeleteRequest期望的特定格式?

1
你的ID是189和190,我想这就是所谓的批量删除吧? - blackapps
1
这是为了批量删除多个图像而获取批准。我知道这些ID是什么,但我不知道请求的URI形式是什么。对我来说,一个服务提供的URI另一个服务不理解似乎很奇怪 - 或者更恰当地说,createDeleteRequest应该能够理解其他旧服务的URI。 - zkon
1
也可以尝试使用ACTION_OPEN_DOCUMENT和ACTION_GET_CONTENT。也许您需要先获取持久的URI权限(这只是一个猜测)。 - blackapps
1个回答

4

最终,我通过从返回的URI中提取媒体编号并使用以下方法重新生成了URI:

ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Long.parseLong(num));

创建符合MediaStore API预期的URI。奇怪的是,图片选择器没有返回其他媒体服务所期望的URI。


1
谈论谷歌让这变得如此奇怪。各种应用程序返回的URI都是混乱不堪的。 - Dibzmania
1
如何从返回的URI中获取媒体编号? - Android Dev
1
当卸载并重新安装应用程序时,媒体始终为0。 - Android Dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接