我正在制作一个应用程序,你可以从存储中选择图像或文档,然后它们会显示在一个有点像Google Drive的列表中,所以你可以选择一个,它就会打开,你就可以查看它了。这个列表是使用RecyclerView实现的,我将uri和文件类型存储在SharedPreferences的json中。我使用以下命令获取内容:
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()
}
}然后我就会打电话给:
getFile.launch("image/*|application/pdf")这并不能让我从内部存储中挑选东西(文件显示为灰色),也不能真正过滤可选文件。不过,它在相机拍摄的图像上工作得很好。为了解决“无法从存储中提取内容”的问题,我将GetContent()改为OpenDocument():
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()
}
}然后我会打电话给:
getFile.launch(
arrayOf(
"application/pdf",
"image/*"
)
)有了这个,我可以从存储中选择文件,它还可以限制我,使您只能选择图像或pdf。我现在的问题是,如果我得到这样的东西,我可以打开文档一次。如果我关闭我的应用程序,然后再次打开它,并尝试再次打开文档,我会收到以下错误:
java.lang.SecurityException: UID 10156 does not have permission to content://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FNewPdf我使用以下代码打开文档:
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的权限有关,但我不知道如何修复它。我也不明白为什么我可以在第一次正确打开文件,但不是在我重启应用程序之后。
发布于 2021-09-07 18:06:40
当您收到指向所选内容的ContentResolver时,您没有立即在Uri上调用Uri。
因此,your rights to access the content will expire -您访问内容的权限将仅限于接收Uri的一个活动实例,而不是其他活动或未来的应用程序进程。
https://stackoverflow.com/questions/69092584
复制相似问题