Как я могу разрешить пользователям Android 10 импортировать zip-файл из папки загрузки в моем приложении?

#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 за то, что указали мне в этом направлении. Я предполагаю, что мой текущий выбор файлов в приложении больше не поддерживается. Не очень рад, что приходится писать дополнительный код (без новых функций), но я рад за ваш быстрый ответ. Экспорт уже работает, но я очень ценю, что вы потратили время :).