Как стать автором
Обновить

Комментарии 11

У меня был такой же кейс, я его решил намного проще через StorageAccessFramework доступный вроде бы с 4.4 версии. Он даже разрешения на запись не требует и работает как обычный файлпикер в десктопах. Пользователь сам сможет выбрать папку и название файла.


https://developer.android.com/training/data-storage/shared/documents-files#create-file

Спасибо за совет. Обязательно посмотрю и проверю этот способ записи файлов.

там тоже не все гладко

Access restrictions

On Android 11 (API level 30) and higher, you cannot use the ACTION_OPEN_DOCUMENT_TREE intent action to request access to the following directories:

На данный момент это можно обойти:

https://stackoverflow.com/a/66466205

Для большей ясности о версиях Android можно посмотреть на следующий скриншот:

ух-ты, гугл наконец обновил эту картинку

Не примите за занудство, но пара советов по коду:

1. Потоки стоит закрывать в finally блоке, иначе привет утечка памяти и дескрипторов файлов. В Java есть удобный механизм try-with-resources. В котлине есть https://www.baeldung.com/kotlin/try-with-resources

2. Логирование ошибок лучше сделать централизовано через библиотеку логирования. Возможно для отслеживания ошибок прикрутить Sentry. Писать e.printStackTrace() уже давно моветон. И в принципе, ошибки стоит отлавливать на том уровне, где вы можете принять решение, что делать дальше - откатиться или показать ошибку пользователю.

3. Для поддержания чистой архитектуры тут напрашивается шаблон Мост. Выделить интерфейс для работы с папкой Download и для разных версий Андроид использовать свою реализацию этого интерфейса.

  1. Спасибо, учту. Я еще новичок в мобильной разработке. Буду этот блок программы дорабатывать.

  2. Что библиотека логирования? Можете дать ссылку? Почему "e.printStackTrace() " - моветон?

  3. Можно вас также попросить подробнее пояснить про шаблон "Мост"?

Спасибо!

. Наверное ваше решение самое правильное, но есть и другой вариант, в манифест вписать

android:requestLegacyExternalStorage="true"

В 11 андройде так же все работает :

To help your app work more smoothly with third-party media libraries, Android 11 allows you to use APIs other than the MediaStore API to access media files from shared storage using direct file paths.


А так можно было? :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории