因此,我不会制作一个简单的录音应用程序,用户无法在其中选择自己喜欢的保存位置。我计划通过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()
}
}
我感到困惑和困惑。没什么复杂的,但我遇到了障碍。
如果使用ACTION_OPEN_DOCUMENT_TREE
,则允许用户选择表示内容集合的文档tree。您无法在其上打开InputStream
。
也许您应该使用ACTION_OPEN_DOCUMENT
。这使用户可以选择单个内容,并且您可以在其上打开一个InputStream
。
顺便说一句,我认为您可以将循环构造替换为:
return context.contentResolver.openInputStream(uri)?.use { it.reader().readLines() }