首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确授予打开通过OpenDocument()获取的文件的权限?

如何正确授予打开通过OpenDocument()获取的文件的权限?
EN

Stack Overflow用户
提问于 2021-09-07 17:47:22
回答 1查看 169关注 0票数 1

我正在制作一个应用程序,你可以从存储中选择图像或文档,然后它们会显示在一个有点像Google Drive的列表中,所以你可以选择一个,它就会打开,你就可以查看它了。这个列表是使用RecyclerView实现的,我将uri和文件类型存储在SharedPreferences的json中。我使用以下命令获取内容:

代码语言:javascript
复制
val getFile = registerForActivityResult(
        ActivityResultContracts.GetContent()
    ) {
        if (it != null) {
            val fileLink = FileLink()
            fileLink.setUri(it.toString())
            fileLink.setType(contentResolver.getType(it)!!)
            fileLink.setName(getFileName(it)!!)
            list.add(fileLink)
            presenter.saveChangesToList(list)
            adapter.notifyDataSetChanged()
        }
    }

然后我就会打电话给:

代码语言:javascript
复制
            getFile.launch("image/*|application/pdf")

这并不能让我从内部存储中挑选东西(文件显示为灰色),也不能真正过滤可选文件。不过,它在相机拍摄的图像上工作得很好。为了解决“无法从存储中提取内容”的问题,我将GetContent()改为OpenDocument():

代码语言:javascript
复制
val getFile = registerForActivityResult(
        ActivityResultContracts.OpenDocument()
    ) {
        if (it != null) {
            val fileLink = FileLink()
            fileLink.setUri(it.toString())
            fileLink.setType(contentResolver.getType(it)!!)
            fileLink.setName(getFileName(it)!!)
            list.add(fileLink)
            presenter.saveChangesToList(list)
            adapter.notifyDataSetChanged()
        }
    }

然后我会打电话给:

代码语言:javascript
复制
getFile.launch(
            arrayOf(
                "application/pdf",
                "image/*"
            )
        )

有了这个,我可以从存储中选择文件,它还可以限制我,使您只能选择图像或pdf。我现在的问题是,如果我得到这样的东西,我可以打开文档一次。如果我关闭我的应用程序,然后再次打开它,并尝试再次打开文档,我会收到以下错误:

代码语言:javascript
复制
 java.lang.SecurityException: UID 10156 does not have permission to content://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FNewPdf

我使用以下代码打开文档:

代码语言:javascript
复制
viewHolder.itemView.setOnClickListener {
            val intent = Intent(Intent.ACTION_VIEW)
            intent.setDataAndType(
                Uri.parse(fileList[position].getUri().toString()),
                fileList[position].getType()
            )
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            context.startActivity(intent)
        }

我能得到一些帮助吗?我猜这与读取uris的权限有关,但我不知道如何修复它。我也不明白为什么我可以在第一次正确打开文件,但不是在我重启应用程序之后。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-07 18:06:40

当您收到指向所选内容的ContentResolver时,您没有立即在Uri上调用Uri

因此,your rights to access the content will expire -您访问内容的权限将仅限于接收Uri的一个活动实例,而不是其他活动或未来的应用程序进程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69092584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档