#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 находятся на тех других «некоторых устройствах», на которых работает ваш код? Я также предполагаю, что вы протестировали свои тосты, и исключение не возникает оттуда.