Я пытаюсь открыть средство выбора файлов в Android, выбрать файл json и получить из него текст. Приложение вылетает после того, как я выбираю файл, потому что не может найти путь.
Я попытался добавить разрешение на чтение/запись внешнего хранилища и изменить формат пути
/// some Activity code
val myFileIntent=Intent()
.setType("*/*")
.setAction(Intent.ACTION_GET_CONTENT)
startActivityForResult(myFileIntent,10)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val path = data!!.data.path
val jsonContent = File(path).readText()
}
Привет, это может быть интересно stackoverflow.com/a/36129285/235354
Вызвано: java.io.FileNotFoundException: /document/raw:/storage/emulated/0/Download/reteta.json (нет такого файла или каталога) в java.io.FileInputStream.open0 (собственный метод) в java.io. FileInputStream.open(FileInputStream.java:231) в java.io.FileInputStream.<init>(FileInputStream.java:165) в kotlin.io.FilesKt__FileReadWriteKt.readBytes(FileReadWrite.kt:63) в kotlin.io.FilesKt__FileReadWriteKt .readText(FileReadWrite.kt:101)
I'm trying to open a file picker in android
Это не сборщик файлов. Это позволяет пользователю выбрать часть контента, которая может быть файлом, а может и не быть.
The app crashes after i select the file
Вы не выбираете файл. Вы выбираете часть контента. Этот контент обозначен Uri, а схема вашего Uri — это content, а не file.
Используйте ContentResolver и openInputStream(), чтобы получить InputStream контент, обозначенный Uri. Вы можете вызвать readText() на этом InputStream, чтобы прочитать его как текст.
Есть ли у вас какие-либо предложения о том, как я могу это реализовать?
Этого делать нельзя. Вы не можете вызвать readText() для этого InputStream, чтобы прочитать его как текст.
@TeodorRadu: Ах, извините, я неправильно запомнил. Вам нужно преобразовать InputStream в BufferedReader: stackoverflow.com/a/39500046/115145
Это мой последний рабочий код:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val path = data?.data
val jsonSelectedFile = contentResolver.openInputStream(path);
val inputAsString = jsonSelectedFile.bufferedReader().use { it.readText() }
Toast.makeText(this, "Json: " + inputAsString , Toast.LENGTH_LONG).show()
}
И для вызова:
importJsonButton.setOnClickListener {
val myFileIntent = Intent()
.setType("*/*")
.setAction(Intent.ACTION_GET_CONTENT)
startActivityForResult(myFileIntent,10)
}
Пожалуйста, опубликуйте трассировку стека