Android Kotlin(初学者) - 从ACTION_GET_CONTENT

时间:2018-05-06 04:54:17

标签: java android kotlin

我对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
        }
    }
}

我不知道发布的代码的其余部分是否有效,但是这个错误不会让我构建它来测试它。任何帮助/指针的TIA

解决:

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

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

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

这很好用。谢谢!

LINKS:

Android: Getting a file URI from a content URI?

In Kotlin, how do I read the entire contents of an InputStream into a String?

2 个答案:

答案 0 :(得分:1)

虽然我无法对您的其他代码发表评论,data!!.data returns android.UriFile需要String [1]。< / p>

您必须将您的Uri转换为文件名:类似File(data!!data.getPath()); [2]

[1]。它也需要一个URI,但这是一个Java.net.URI,而不是Android.Uri。

[2]。你仍然应该确保你得到一个指向文件系统路径的Uri。您可能还需要执行this之类的操作。

答案 1 :(得分:1)

你不应该使用File类来获取ACTION_GET_CONTENT获得的uri。

你也不应该从该uri推导出一个文件路径来使用它上面的File类。

相反,如果您想要读取内容,则应直接打开获取的uri的输入流。