Не удается открыть InputStream для результата Intent.ACTION_OPEN_DOCUMENT_TREE - PullRequest
0 голосов
/ 19 февраля 2020

Итак, я не хочу делать простое приложение для записи, в котором пользователь может выбрать предпочитаемое место сохранения. Я планирую получить Uri выбранного каталога через Intent.ACTION_OPEN_DOCUMENT_TREE, сохранить и обработать его с помощью InputStream и MediaRecorder.

Когда я пытаюсь обработать Result в моем 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: Failure выдача результата ResultInfo {who = null, request = 65537, result = -1, data = Intent {dat = content: //com.android.externalstorage.documents/tree/primary: Download flg = 0xc3}} в действие { de.ur.mi.audidroid / de.ur.mi.audidroid.views.MainActivity}: java .lang.IllegalArgumentException: недействительный URI: content: //com.android.externalstorage.documents/tree/primary% 3Загрузить

Я не знаю, почему это не займет ури. DocumentFile примет это без каких-либо жалоб через DocumentFile.fromTreeUri(context!!,uri!!).

InputStreamHelper - это объект, который я в основном скопировал непосредственно из документации .

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()
}
}

Я в замешательстве и растерянности. Ничего сложного, но я наткнулся на контрольно-пропускной пункт.

1 Ответ

1 голос
/ 19 февраля 2020

Если вы использовали ACTION_OPEN_DOCUMENT_TREE, это позволяет пользователю выбрать документ дерево , представляющий коллекцию контента. Вы не можете открыть InputStream для этого.

Возможно, вам следует использовать ACTION_OPEN_DOCUMENT. Это позволяет пользователю выбирать отдельный фрагмент контента, и вы можете открыть InputStream для этого.

Кстати, я думаю, что вы могли бы заменить эту конструкцию l oop на:

return context.contentResolver.openInputStream(uri)?.use { it.reader().readLines() }
...