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 访问内容...假设用户没有做一些戏剧性的事情,比如删除它。
我的应用通过 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 访问内容...假设用户没有做一些戏剧性的事情,比如删除它。