Android "storing" 和 "reusing" 获得的 URI

Android "storing" and "reusing" obtained URIs

我的应用通过 ACTION_PICK Intent 收集媒体 android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI

内容类型。当我检索到我想要的内容的 URI 时,效果很好,我可以通过以下方式查看它:

val intent = Intent(Intent.ACTION_VIEW, myURI)
intent.setDataAndType(myURI,contentResolver.getType(myURI))
intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION)
startActivity(intent)

我用 Uri.toString 方法存储 Uri,当我关闭 activity 并再次打开它时,我收到以下错误:

java.lang.SecurityException: UID 10315 does not have permission to content://com.miui.gallery.open/raw/%2Fstorage%2Femulated%2F0%2FDCIM%2FCamera%2FVID_20200814_214253.mp4 [user 0]

再往下还有:

Caused by: android.os.RemoteException: Remote stack trace:
    at com.android.server.uri.UriGrantsManagerService.checkGrantUriPermission(UriGrantsManagerService.java:1192)
    at com.android.server.uri.UriGrantsManagerService.checkGrantUriPermissionFromIntent(UriGrantsManagerService.java:579)
    at com.android.server.uri.UriGrantsManagerService.grantUriPermissionFromIntent(UriGrantsManagerService.java:618)
    at com.android.server.uri.UriGrantsManagerService$LocalService.grantUriPermissionFromIntent(UriGrantsManagerService.java:1392)

理想情况下,我会获取媒体的文件路径并通过 fileProvider 从文件生成 URI,但我还没有找到从 ContentURIs 获取绝对路径的方法。

通读 https://commonsware.com/blog/2016/08/10/uri-access-lifetime-shorter-than-you-might-think.html,它更好地解释了正在发生的事情,那么如何重用或存储通过其 URI 检索到的文件?我可以通过某种方式检索文件路径而不是 URI 吗?

I store the Uri with Uri.toString method

那是行不通的。您对从 ACTION_PICK 获得的内容的权利是 very short-lived。 (注意:这个 link 是我的博客 post 的较新版本,你在问题中 link 访问过)

Ideally I would get the file path of the media

那也是行不通的。不需要 ACTION_PICK 或类似的操作 return 与文件系统相关的任何内容,更不用说您可以直接访问的某些文件了。在您的特定情况下,MediaStore 比您拥有更大的访问权限,因此您在 MediaStore 中找到的内容可能无法访问,即使您查询 semi-deprecated DATA 列尝试找到路径。另外,用户选择的 ACTION_PICK 的实现可能不会 return 和 MediaStore Uri 无论如何。

如果您需要能够 select 一段内容,保留其 Uri,并在以后使用该 Uri 处理该内容,您需要:

  • 使用ACTION_OPEN_DOCUMENT代替ACTION_PICK

  • ContentResolver 上调用 takePersistableUriPermissions(),传入你得到的 Uri

现在,您可以 long-term 访问内容...假设用户没有做一些戏剧性的事情,比如删除它。