Запись в файл в Android (Новое хранилище с областью действия)

#android #android-fragments #android-external-storage #file-storage

Вопрос:

Я написал приведенный ниже код для записи PDF-файла с помощью ResponseBody.

  private fun writeResponseBodyToDisk(body: ResponseBody): Boolean {
    return try {
       val fName = "TestFile.pdf"
        val directoryName =
           context
                .getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)

        val actualFileName = File(directoryName, fName)
        if(!actualFileName.exists()){
            actualFileName.createNewFile()
        }

        var inputStream: InputStream? = null
        var outputStream: OutputStream? = null
        try {
            val fileReader = ByteArray(4096)
            var fileSizeDownloaded: Long = 0
            inputStream = body.byteStream()
            outputStream = FileOutputStream(actualFileName)
            while (true) {
                val read: Int = inputStream.read(fileReader)
                if (read == -1) {
                    break
                }
                outputStream.write(fileReader, 0, read)
                fileSizeDownloaded  = read.toLong()
            }
            ToastUtils.showShort("File Downloaded")
            outputStream.flush()
            true
        } catch (e: IOException) {
            ToastUtils.showShort("WRITE Catch Block==>" e.message)
            false
        } finally {
            setShowLoading(false)
            if (inputStream != null) {
                inputStream.close()
            }
            if (outputStream != null) {
                outputStream.close()
            }
        }
    } catch (e: IOException) {
        ToastUtils.showShort("PDF Catch Block==>" e.message)
        false
    }
}
 

Всякий раз, когда выполняется вышеупомянутый код, я всегда получаю исключение в Catch.

Исключение: /хранилище/эмулировано/0/Android/данные/com.xyz.abc.staging/файлы/Загрузка/Тестовый файл.pdf: открыть не удалось: EISDIR (является каталогом)

Я тестирую его на Android 11, и мне нужно создать этот код для Android 6 и выше. Тем не менее, он хорошо работает на некоторых устройствах.

Ответ №1:

Глупый вопрос, но поскольку вы ничего об этом не сказали, существует ли каталог /storage/emulated/0/Android/data/com.xyz.abc.staging/файлы/Загрузка/Тестовый файл.pdf на вашем устройстве? Если да, то удалите его и попробуйте запустить свой код снова. В целом ваш код должен работать на Android 11. В качестве примечания вы должны проверить возвращаемое значение из actualFileName.createNewFile(). Кроме того, можете ли вы указать, какие версии Android находятся на тех других «некоторых устройствах», на которых работает ваш код? Я также предполагаю, что вы протестировали свои тосты, и исключение не возникает оттуда.