Kotlin как правильно использовать Android Намерение сохранить файл - PullRequest
0 голосов
/ 08 мая 2020

Сейчас я пытаюсь сохранить текстовый файл внутри фрагмента, но не могу заставить его работать:

Вот метод, вызываемый, когда пользователь нажимает кнопку сохранения

    private fun saveText(){
    val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
        addCategory(Intent.CATEGORY_OPENABLE)
        type = "*/*"
        putExtra(Intent.EXTRA_TITLE, "text.txt")
    }
    startActivityForResult(intent, 1)
    }

Вот метод onActivityResult:

    override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
    if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
        try {
            val path = resultData?.data?.path
            Log.wtf("Path", filePath)
            val writer: Writer = BufferedWriter(FileWriter(path))
            writer.write("Example Text")
            writer.close()
        } catch (e: Exception){
            e.printStackTrace()
        }
    }
}

У меня также есть разрешения, установленные в манифесте, и сам файл создается, но ничего не записывается. Возможно, я неправильно пишу в файл?

Вызывается ошибка FileNotFoundException, поскольку он пытается использовать файл из / document, когда я выбираю его из / downloads

Предлагаемое решение, которое к сожалению не работает:

                resultData?.data?.let {
                requireActivity().contentResolver.openOutputStream(it).use { stream ->
                    stream!!.bufferedWriter().write("Example Text")
                }
            }

1 Ответ

0 голосов
/ 08 мая 2020

A Uri не является файлом.

Замените:

        val path = resultData?.data?.path
        Log.wtf("Path", filePath)
        val writer: Writer = BufferedWriter(FileWriter(path))
        writer.write("Example Text")
        writer.close()

на:

resultData?.data?.let { contentResolver.openOutputStream(it).use { stream ->
    stream.writer().write("Example Text")
  }
}
...