#android #import #storage #android-10.0 #scoped-storage
Вопрос:
Приложение «Мои идеи» не имеет серверной части в Интернете, поэтому пользователи могут экспортировать zip-файл для резервного копирования/передачи своих идей. Затем на своем другом (новом) устройстве они могли импортировать zip-файл из папки загрузки. Внутри приложения zip-файл извлекается и содержимое (текст, аудио, изображения) воссоздается заново.
Начиная с Android 10 (и выше), способ работы файлов и разрешений отличается.
На https://developer.android.com/training/data-storage/shared/documents-files#grant-access-directory
там написано:
При использовании ACTION_OPEN_DOCUMENT_TREE ваше приложение получает доступ только к файлам в каталоге, выбранном пользователем.
На Android 11 (уровень API 30) и выше вы не можете использовать действие ACTION_OPEN_DOCUMENT_TREE intent для запроса доступа к […] каталогу загрузки.
https://developer.android.com/about/versions/10/privacy/changes
По умолчанию приложениям, ориентированным на Android 10 и выше, предоставляется ограниченный доступ к внешнему хранилищу или к хранилищу с ограниченной областью. Такие приложения могут просматривать файлы следующих типов на внешнем устройстве хранения без необходимости запрашивать какие-либо разрешения пользователя, связанные с хранением:
- Файлы в каталоге конкретного приложения, доступ к которым осуществляется с помощью getExternalFilesDir().
- Фотографии, видео и аудиоклипы, созданные приложением из магазина мультимедиа.
https://developer.android.com/about/versions/11/privacy/storage
(насколько я могу судить, те же правила, что и для 10, касающиеся моей проблемы)
Поскольку мои файлы не являются медиафайлами, кажется невозможным разрешить пользователям выбирать файл из списка.
Я действительно думал, что мое текущее решение (средство выбора файлов, указывающее на Environment.getExternalStorageDirectory()
) работает, так как оно работало в эмуляторе. Но сегодня я получил новое устройство с Android 10, и оно вышло из строя.
Мне очень трудно найти ответ на этот вопрос, потому что все поисковые слова и документация решаются вокруг медиафайлов (в основном изображений).
Подойдет любой способ, которым пользователь может импортировать zip-файл. Но обычному пользователю довольно сложно сначала переместить загруженный / переданный по USB файл в определенные папки приложения или что-то в этом роде.
Комментарии:
1. Я в замешательстве. Вы упомянули довольно много вещей о доступе ко всему каталогу , но вам, похоже, не нужен доступ ко всему каталогу, вы просто хотите, чтобы пользователи могли выбрать zip-файл, который они загрузили / который доступен на Google Диске / что угодно?
2. Теперь в приложении это работает так: они выбирают свой файл из списка каталогов для импорта. Таким образом, вы остаетесь внутри приложения, я думаю, что единственный другой способ, которым это можно сделать, — это открыть приложение «проводник» и оттуда «поделиться» файлом в приложении. Я думаю, что людям может быть труднее это сделать. Это потребовало бы гораздо большего количества изменений в моем коде, так что для меня это дополнительный недостаток, но если это единственный способ, то это также было бы вариантом.
3. Используйте
ACTION_OPEN_DOCUMENT
/ActivityResultContracts.OpenDocument
, чтобы позволить пользователю выбрать почтовый индекс для импорта. ИспользуйтеACTION_CREATE_DOCUMENT
/ActivityResultContracts.CreateDocument
, чтобы позволить пользователю выбрать, куда записать ZIP для экспорта. Для импорта вам, вероятно, нужно скопировать ZIP в какой-либо файл, которым вы управляете (например, вgetCacheDir()
), распаковать его, а затем удалить копию. Аналогично, для экспорта вам, вероятно, потребуется создать ZIP-файл в виде файла, затем скопировать его в нужное место пользователя, а затем удалить оригинал. API-интерфейсы ZIP могут использоваться напрямую без копий, но я не уверен на 100%.4. Спасибо @CommonsWare за то, что указали мне в этом направлении. Я предполагаю, что мой текущий выбор файлов в приложении больше не поддерживается. Не очень рад, что приходится писать дополнительный код (без новых функций), но я рад за ваш быстрый ответ. Экспорт уже работает, но я очень ценю, что вы потратили время :).