Как прочитать файл json из пути с помощью kotlin

Я пытаюсь открыть средство выбора файлов в 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()
    }

Пожалуйста, опубликуйте трассировку стека

luckyhandler 29.04.2019 19:36

Привет, это может быть интересно stackoverflow.com/a/36129285/235354

jspcal 29.04.2019 19:37

Вызвано: 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.k‌​t:63) в kotlin.io.FilesKt__FileReadWriteKt .readText(FileReadWrite.kt‌​:101)

Teodor Radu 29.04.2019 19:50
2
3
1 249
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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, чтобы прочитать его как текст.

Есть ли у вас какие-либо предложения о том, как я могу это реализовать?

Teodor Radu 29.04.2019 20:31

Этого делать нельзя. Вы не можете вызвать readText() для этого InputStream, чтобы прочитать его как текст.

Teodor Radu 29.04.2019 20:52

@TeodorRadu: Ах, извините, я неправильно запомнил. Вам нужно преобразовать InputStream в BufferedReader: stackoverflow.com/a/39500046/115145

CommonsWare 29.04.2019 20:54
Ответ принят как подходящий

Это мой последний рабочий код:

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

Другие вопросы по теме