Сохранение файла во внутреннем хранилище с помощью Uri (получено из сети Storage Access) - PullRequest
1 голос
/ 23 марта 2019

Я использую Storage Access Network, чтобы выбрать файл и сохранить его во внутреннем хранилище, чтобы приложение могло использовать его в будущем.

Я получаю URI без каких-либо проблем.Это что-то вроде контента: //com.android.providers.media.documents/document/image%3A141274

Проблема возникает, когда я пытаюсь сохранить изображение во внутреннем каталоге.Код проходит без сбоев, изображение с таким же размером сохраняется во внутреннем каталоге (я вижу это в проводнике устройств: https://take.ms/3TwBS). Но само изображение повреждено и не может быть открыт.

Вот код Iиспользую (после получения URI)

val destinationFile = File("${context.filesDir.absolutePath}/$fileName")
try {
                        val writer = FileWriter(destinationFile)
                        writer.append(readTextFromUri(it))
                        writer.flush()
                        writer.close()

                    } catch (e: Exception) {
                        e.printStackTrace()

                    }


 @Throws(IOException::class)
    private fun readTextFromUri(uri: Uri): String {
        val inputStream = activity!!.contentResolver.openInputStream(uri)
        val reader = BufferedReader(InputStreamReader(inputStream))
        val stringBuilder = StringBuilder()
        var line: String? = null
        while ({ line = reader.readLine(); line }() != null) {
            stringBuilder.append(line)
        }
        inputStream?.close()
        reader.close()
        return stringBuilder.toString()
    }

1 Ответ

0 голосов
/ 23 марта 2019

Как описал @CommonsWare, я должен был правильно обращаться с файлами, а не с текстами.

Правильный способ сделать:

private fun inputStreamToFile(uri: Uri){
        val inputStream = contentResolver.openInputStream(uri)
        val output = FileOutputStream(File("${filesDir.absoluteFile}/magic.png"))
        inputStream?.copyTo(output, 4 * 1024)
} 

или более длинный путь (без функций расширения)

fun inputStreamToFile(uri: Uri){
        val inputStream = contentResolver.openInputStream(uri)
        inputStream.use {
            val directory = getDir("test", Context.MODE_PRIVATE)
            val file = File(directory, "correct.txt")
            val output = FileOutputStream(file)
            output.use {
                val buffer = ByteArray(4 * 1024) // or other buffer size
                var read: Int = inputStream?.read(buffer) ?: -1
                while (read != -1) {
                    output.write(buffer, 0, read)
                    read = inputStream?.read(buffer) ?: -1
                }
                output.flush()
            }
        }
    }
...