android - 如何使用最新的 Android 存储框架使用意图操作打开文件?
问题描述
由于 Android 最近对存储框架进行了重大更改,因此许多文档都在讨论权限和范围存储。但是我找不到有关如何处理文件的 Uri 的详细信息,因为它可以被其他应用程序读取。
其他应用程序查看/读取文件的意图操作失败。我不明白这里有什么问题;
- 它与和之间的区别有关吗?
java.io.File
java.nio.File
- Uri 缺少权限或 Uri 格式不正确。
Android存储示例(FileManager) 也有此错误。它成功列出了目录中的所有文件,但无法打开选定的图像或文档。我已经报告了这个问题,但到目前为止没有任何帮助。
以下片段来自 FileManager (storage-samples)
fun openFile(activity: AppCompatActivity, selectedItem: File) {
// Get URI and MIME type of file
val uri = Uri.fromFile(selectedItem).normalizeScheme()
val mime: String = getMimeType(uri.toString())
// Open file with user selected app
val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.data = uri
intent.type = mime
return activity.startActivity(intent)
}
解决方案
在评论的提示之后,我在developer docs中找到了答案。
注意:如果您想同时设置 URI 和 MIME 类型,请不要调用setData()和setType(),因为它们都会使对方的值无效。始终使用setDataAndType()来设置 URI 和 MIME 类型。
openFile
没有抛出android-storage-samplesFileUriExposedException
背后的原因是,在设置之后,Uri 被无效,当我将其更改为时,我得到了异常。最后的片段看起来像intent.type
setDataAndType()
fun openFile(activity: AppCompatActivity, selectedItem: File) {
// Get URI and MIME type of file
val uri = FileProvider.getUriForFile(activity.applicationContext, AUTHORITY, selectedItem)
// val uri = Uri.fromFile(selectedItem).normalizeScheme()
val mime: String = getMimeType(uri.toString())
// Open file with user selected app
val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
// intent.data = uri
// intent.type = mime
intent.setDataAndType(uri, mime)
return activity.startActivity(intent)
}
我认为他们忘记了随着时间的推移更新样本,让我创建一个拉取请求以在那里提交这个更改。