首页 > 解决方案 > 在服务中使用通过 Intent 选择器检索到的 Uri

问题描述

我正在尝试在一个中选择URI一个视频Activity,然后在一个中使用 Uri(访问其内容)Service

我正在做的是:

  1. 在一个 Activity 中,选择一个 Uri:
val intent = Intent(ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
intent.type = "video/*"
startActivityForResult(intent, PICK_VIDEO)
  1. 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!!) }
            }
        }
    }
  1. 然后,我立即打开一个Service(实际上是一个IntentServiceActivity。我通过了检索到的 Uri。

  2. 在中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没有给我想要的用户体验,因为我只是希望用户从画廊中选择一些东西,而不允许文件夹导航。

标签: androidandroid-serviceandroid-contentproviderandroid-permissionspermission-denied

解决方案


从上面的代码中并不清楚,但我猜测下一次调用,您将启动一些可以访问文件的本机应用程序,并仅返回指向该文件的链接。

val intent = Intent(ACTION_OPEN_DOCUMENT, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
intent.type = "video/*"
startActivityForResult(intent, PICK_VIDEO)

此时,既无ActivityService无权访问文件。因为在Activity你只使用一条路径。

1)只要确保您在官方文档中提到的内容提供者中具有适当的权限。和/或Content Provider 中的数据访问权限


推荐阅读