我对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?
答案 0 :(得分:1)
虽然我无法对您的其他代码发表评论,data!!.data
returns android.Uri
和File
需要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的输入流。