有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android Kotlin(初学者)使用File(),并从ACTION\u GET\u内容返回Uri

我对Android和Kotlin/Java都很陌生。我不明白为什么我的File()方法会出错:

none of the following functions can be called with the arguments supplied.

我认为我所放置的应该返回从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需要任何帮助/提示吗

决议:

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

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

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

这很有效。谢谢大家!

链接:

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) 个答案

  1. # 1 楼答案

    虽然我无法对代码的其余部分进行注释,data!!.data{a1}{}和File采用了String[1]

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

    [1]。它还需要一个URI,但这是一个Java。网URI,而不是Android。乌里

    [2]。您仍然应该确保您得到的Uri指向文件系统上的路径。您可能还必须执行类似this的操作

  2. # 2 楼答案

    您不应该将File类用于由ACTION_GET_CONTENT获得的uri

    您也不应该从该uri推断文件路径以在其上使用文件类

    相反,如果要读取获取的uri的内容,则应该直接为其打开inputstream