Android Kotlin初学者 - 使用从ACTION_GET_CONTENT返回的Uri与File()

4
我是一个新手,对Android和Kotlin/Java都不太熟悉。我不明白为什么我的File()方法会出现以下错误信息:

无法使用提供的参数调用以下任何函数。

我原以为我所输入的内容应该返回通过ACTION_GET_CONTENT获取到的Uri,并且这应该足以构建File对象。我正在尝试制作一个加载txt文件并显示它的应用程序。我希望这只是一个非常简单的错误。
fun showFileDialog() {
    val fileintent = Intent(Intent.ACTION_GET_CONTENT)
    fileintent.setType("text/plain")
    fileintent.addCategory(Intent.CATEGORY_OPENABLE)
    startActivityForResult(fileintent, FILE_SELECT_CODE)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 
    super.onActivityResult(requestCode, resultCode, data)
    if(requestCode == FILE_SELECT_CODE && resultCode == Activity.RESULT_OK) {
        val selectedfile = File(data!!.data)
        val readData = FileInputStream(selectedfile).bufferedReader().use { it.readText
            textView.text = readData
        }
    }
}

我不知道剩下的代码是否有效,但这个错误不允许我构建它以进行测试。感谢任何帮助/提示。

已解决:

第一个回答解释了为什么我会得到这个错误(因此,回答了我的问题)

在得到第二个答案和下面的评论的帮助后(以及在SO上的更多搜索;请参见下面的链接),我将我的最后3行代码更改为:

val input: InputStream = getContentResolver().openInputStream(data!!.data)
val inputAsString = input.bufferedReader().use { it.readText() }
textView.setText(inputAsString)

这个很好用。谢谢!

链接:

Android:如何从内容URI获取文件URI?

在Kotlin中,如何将InputStream的所有内容读入String中?


你不应该使用File类来处理通过ACTION_GET_CONTENT获取的URI。也不应该从该URI推断出文件路径并使用File类对其进行操作。相反,如果您想要读取它的内容,应该直接打开获得的URI的输入流。 - greenapps
谢谢 @greenapps。我已经进行了更改并且它运行良好。getContentResolver().openInputStream() 似乎接受 android.Uri。 - 0ptl
2个回答

3

虽然我不能评论你代码的其他部分,但是 data!!.data 返回 一个 android.Uri,而 File 接受一个 String[1]。

你需要将你的 Uri 转换为文件名:类似于 File(data!!data.getPath()); [2]

[1]. 它也可以接受一个 URI,但那是 Java.net.URI,而不是 Android.Uri。

[2]. 你仍然应该确保你获取的 Uri 指向文件系统上的路径。你可能还需要做类似于 这个 的事情。


谢谢,特别是注意[1]。我之前没有意识到URI中有这种区别。 - 0ptl

1

您不应该使用File类处理通过ACTION_GET_CONTENT获取的URI。

也不应该从该URI中推断出文件路径以便在其上使用File类。

相反,如果要读取其内容,则应直接打开获得的URI的输入流。


我希望能够接受两个答案,因为这是一个非常有用的改进。 - 0ptl
这不是改进,实际上它是你问题的唯一答案/解决方案。 - greenapps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接