android - 在服务中使用通过 Intent 选择器检索到的 Uri
问题描述
我正在尝试在一个中选择URI
一个视频Activity
,然后在一个中使用 Uri(访问其内容)Service
。
我正在做的是:
- 在一个 Activity 中,选择一个 Uri:
val intent = Intent(ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
intent.type = "video/*"
startActivityForResult(intent, PICK_VIDEO)
- 在
onActivityResult
中,我从返回的包中获取 Uri:
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
super.onActivityResult(requestCode, resultCode, intent)
if (resultCode == Activity.RESULT_OK) {
when (requestCode) {
PICK_VIDEO -> { openService(intent?.data!!) }
}
}
}
然后,我立即打开一个
Service
(实际上是一个IntentService
)Activity
。我通过了检索到的 Uri。在中
Service
,我尝试阅读中的内容Uri
。
override fun onHandleIntent(intent: Intent?) {
intent?.let {
Log.i(TAG, "Uploading video.")
// read the contents of the Uri with ContentPrrovider
}
当试图这样做时,我得到:
Caused by: java.lang.SecurityException: UID 10091 does not have permission to content://com.google.android.apps.photos.contentprovider/-1/2/content%3A%2F%2Fmedia%2Fexternal%2Fvideo%2Fmedia%2F56/ORIGINAL/NONE/1281553805 [user 0]
我怎样才能解决这个问题?如何授予我Service
的(属于同一应用程序的)读取 Uri 的权限?
请注意,我需要PICK
从图库中获取一个文件。ACTION_OPEN_DOCUMENT
没有给我想要的用户体验,因为我只是希望用户从画廊中选择一些东西,而不允许文件夹导航。
解决方案
从上面的代码中并不清楚,但我猜测下一次调用,您将启动一些可以访问文件的本机应用程序,并仅返回指向该文件的链接。
val intent = Intent(ACTION_OPEN_DOCUMENT, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
intent.type = "video/*"
startActivityForResult(intent, PICK_VIDEO)
此时,既无Activity
也Service
无权访问文件。因为在Activity
你只使用一条路径。
1)只要确保您在官方文档中提到的内容提供者中具有适当的权限。和/或Content Provider 中的数据访问权限。
推荐阅读
- c++ - 解构 const 指针?
- sql-server - Excel没有从视图中提取所有记录
- c - 快速 C 随机布尔生成器
- python - pyspark.sql.types.Row 列出
- bash - 将整个提交复制到单独的目录中
- amazon-ec2 - /var/log/cloud-init-output.log 在 RHEL 7.5 上不存在
- qt - 是否可以在 XP 上运行 Qt 5.10 程序?
- jenkins - 詹金斯正在用其他文本替换构建步骤中的文本
- c# - c# 两个 web 参考,一个用于 live on 用于测试
- database - 在 VSTS 中的现有数据库上手动将数据库部署到 SSDT