Записать файл в каталог загрузки на Android ⇐ Android
-
Anonymous
Записать файл в каталог загрузки на Android
Ниже мой код
Каталог загрузки файлов = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); длинный currentTimestamp = System.currentTimeMillis(); Строковое имя файла = "downloaded_image_" + currentTimestamp + ".png"; Файл imageFile = новый файл (каталог загрузок, имя файла); пытаться { FileOutputStream outputStream = новый FileOutputStream (imageFile); outputStream.write(imageBytes); выходной поток.закрыть(); } catch (FileNotFoundException e) { выдать новое RuntimeException(e); } catch (IOException e) { выдать новое RuntimeException(e); } Я добавил разрешения
Теперь мой приведенный выше код отлично работает на Android 12.
Но на Android 8 и Android 10 это не работает из-за ошибки
java.lang.RuntimeException: java.io.FileNotFoundException: /storage/emulated/0/Download/downloaded_image_1697897803982.png: ошибка открытия: EACCES (в разрешении отказано)
В Интернете мне сказали, что приведенный ниже код должен работать со всеми API (более 24), но не означает ли приведенный ниже код, что мой код не должен работать на Android 12 и работать на Android 8/9? Я не понимаю, как мой код (код выше) работает на Android 12, но не на 8/9, а ниже должен работать.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { StorageManager StorageManager = getSystemService(StorageManager.class); StorageVolume StorageVolume = StorageManager.getStorageVolumes().get(0); Каталог загрузки файлов = StorageVolume.getDirectory(Environment.DIRECTORY_DOWNLOADS); длинный currentTimestamp = System.currentTimeMillis(); Строковое имя файла = "downloaded_image_" + currentTimestamp + ".png"; Файл imageFile = новый файл (каталог загрузок, имя файла); пытаться { FileOutputStream outputStream = новый FileOutputStream (imageFile); outputStream.write(imageBytes); выходной поток.закрыть(); } catch (FileNotFoundException e) { выдать новое RuntimeException(e); } catch (IOException e) { выдать новое RuntimeException(e); } } еще { Каталог загрузки файлов = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); длинный currentTimestamp = System.currentTimeMillis(); Строковое имя файла = "downloaded_image_" + currentTimestamp + ".png"; Файл imageFile = новый файл (каталог загрузок, имя файла); пытаться { FileOutputStream outputStream = новый FileOutputStream (imageFile); outputStream.write(imageBytes); выходной поток.закрыть(); } catch (FileNotFoundException e) { выдать новое RuntimeException(e); } catch (IOException e) { выдать новое RuntimeException(e); } }
Ниже мой код
Каталог загрузки файлов = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); длинный currentTimestamp = System.currentTimeMillis(); Строковое имя файла = "downloaded_image_" + currentTimestamp + ".png"; Файл imageFile = новый файл (каталог загрузок, имя файла); пытаться { FileOutputStream outputStream = новый FileOutputStream (imageFile); outputStream.write(imageBytes); выходной поток.закрыть(); } catch (FileNotFoundException e) { выдать новое RuntimeException(e); } catch (IOException e) { выдать новое RuntimeException(e); } Я добавил разрешения
Теперь мой приведенный выше код отлично работает на Android 12.
Но на Android 8 и Android 10 это не работает из-за ошибки
java.lang.RuntimeException: java.io.FileNotFoundException: /storage/emulated/0/Download/downloaded_image_1697897803982.png: ошибка открытия: EACCES (в разрешении отказано)
В Интернете мне сказали, что приведенный ниже код должен работать со всеми API (более 24), но не означает ли приведенный ниже код, что мой код не должен работать на Android 12 и работать на Android 8/9? Я не понимаю, как мой код (код выше) работает на Android 12, но не на 8/9, а ниже должен работать.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { StorageManager StorageManager = getSystemService(StorageManager.class); StorageVolume StorageVolume = StorageManager.getStorageVolumes().get(0); Каталог загрузки файлов = StorageVolume.getDirectory(Environment.DIRECTORY_DOWNLOADS); длинный currentTimestamp = System.currentTimeMillis(); Строковое имя файла = "downloaded_image_" + currentTimestamp + ".png"; Файл imageFile = новый файл (каталог загрузок, имя файла); пытаться { FileOutputStream outputStream = новый FileOutputStream (imageFile); outputStream.write(imageBytes); выходной поток.закрыть(); } catch (FileNotFoundException e) { выдать новое RuntimeException(e); } catch (IOException e) { выдать новое RuntimeException(e); } } еще { Каталог загрузки файлов = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); длинный currentTimestamp = System.currentTimeMillis(); Строковое имя файла = "downloaded_image_" + currentTimestamp + ".png"; Файл imageFile = новый файл (каталог загрузок, имя файла); пытаться { FileOutputStream outputStream = новый FileOutputStream (imageFile); outputStream.write(imageBytes); выходной поток.закрыть(); } catch (FileNotFoundException e) { выдать новое RuntimeException(e); } catch (IOException e) { выдать новое RuntimeException(e); } }
Мобильная версия