首页 > 解决方案 > 如何使用最新的 Android 存储框架使用意图操作打开文件?

问题描述

由于 Android 最近对存储框架进行了重大更改,因此许多文档都在讨论权限和范围存储。但是我找不到有关如何处理文件的 Uri 的详细信息,因为它可以被其他应用程序读取。

其他应用程序查看/读取文件的意图操作失败。我不明白这里有什么问题;

  1. 它与和之间的区别有关吗?java.io.Filejava.nio.File
  2. 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)
}

标签: androidandroid-intentandroid-permissionsandroid-storage

解决方案


在评论的提示之后,我在developer docs中找到了答案。

注意:如果您想同时设置 URI 和 MIME 类型,请不要调用setData()setType(),因为它们都会使对方的值无效。始终使用setDataAndType()来设置 URI 和 MIME 类型。

openFile没有抛出android-storage-samplesFileUriExposedException背后的原因是,在设置之后,Uri 被无效,当我将其更改为时,我得到了异常。最后的片段看起来像intent.typesetDataAndType()

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)
}

我认为他们忘记了随着时间的推移更新样本,让我创建一个拉取请求以在那里提交这个更改。


推荐阅读