无法在Intent上打开InputStream。ACTION_OPEN_DOCUMENT_TREE结果

问题描述 投票:0回答:1

因此,我不会制作一个简单的录音应用程序,用户无法在其中选择自己喜欢的保存位置。我计划通过Intent.ACTION_OPEN_DOCUMENT_TREE获取所选目录的Uri,并使用InputStream和MediaRecorder保存并处理它。

[当我尝试在onActivityResult中处理结果时,

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == resources.getInteger(R.integer.request_code_preference_storage) &&
                resultCode == Activity.RESULT_OK){
            val uri = data!!.data
            val inputstream = InputStreamHelper.readTextFromUri(uri!!, context!!)
    }

我收到以下错误:

java.lang.RuntimeException:无法交付结果ResultInfo {who = null,request = 65537,result = -1,data = Intent {dat = content://com.android.externalstorage.documents/tree/primary:下载flg = 0xc3}}到活动{de.ur.mi.audidroid / de.ur.mi.audidroid.views.MainActivity}:java.lang.IllegalArgumentException:无效的URI:content://com.android.externalstorage.documents/tree / primary%3ADownload

我不知道为什么它不会占用uri。 DocumentFile将通过DocumentFile.fromTreeUri(context!!,uri!!)毫无保留地接受它。

InputStreamHelper是我基本上直接从documentation复制的对象。

object InputStreamHelper{
fun readTextFromUri(uri: Uri, context: Context): String {
    val stringBuilder = StringBuilder()
    context.contentResolver.openInputStream(uri)?.use { inputStream ->
        BufferedReader(InputStreamReader(inputStream)).use { reader ->
            var line: String? = reader.readLine()
            while (line != null) {
                stringBuilder.append(line)
                line = reader.readLine()
            }
        }
    }
    return stringBuilder.toString()
}
}

我感到困惑和困惑。没什么复杂的,但我遇到了障碍。

android kotlin inputstream
1个回答
0
投票

如果使用ACTION_OPEN_DOCUMENT_TREE,则允许​​用户选择表示内容集合的文档tree。您无法在其上打开InputStream

也许您应该使用ACTION_OPEN_DOCUMENT。这使用户可以选择单个内容,并且您可以在其上打开一个InputStream

顺便说一句,我认为您可以将循环构造替换为:

return context.contentResolver.openInputStream(uri)?.use { it.reader().readLines() }
© www.soinside.com 2019 - 2024. All rights reserved.