Управляйте всеми файлами на устройстве хранения

Большинство приложений, требующих доступа к общему хранилищу, могут следовать рекомендациям по обмену медиафайлами и файлами, не относящимися к медиа . Однако у некоторых приложений есть основная задача, требующая широкого доступа к файлам на устройстве, но они не могут эффективно использовать для этого методы, обеспечивающие конфиденциальность при работе с хранилищем. В таких ситуациях Android предоставляет специальное приложение для доступа ко всем файлам, называемое доступом ко всем файлам .

Например, основное назначение антивирусного приложения может заключаться в регулярном сканировании множества файлов в разных каталогах. Если это сканирование требует от пользователя многократного взаимодействия для выбора каталогов с помощью системного средства выбора файлов, это ухудшает пользовательский опыт. Другие сценарии использования — такие как файловые менеджеры, приложения для резервного копирования и восстановления, а также приложения для управления документами — требуют аналогичного подхода.

Запросить доступ ко всем файлам

Приложение может запросить у пользователя доступ ко всем файлам следующим образом:

  1. Укажите разрешение MANAGE_EXTERNAL_STORAGE в манифесте.
  2. Используйте действие интента ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION , чтобы перенаправить пользователей на страницу системных настроек, где они смогут включить для вашего приложения следующую опцию: «Разрешить доступ к управлению всеми файлами» .

Чтобы определить, предоставлено ли вашему приложению разрешение MANAGE_EXTERNAL_STORAGE , вызовите Environment.isExternalStorageManager() .

Операции, разрешенные параметром MANAGE_EXTERNAL_STORAGE.

Разрешение MANAGE_EXTERNAL_STORAGE предоставляет следующие права:

  • Доступ на чтение и запись ко всем файлам в общем хранилище .

  • Доступ к содержимому таблицы MediaStore.Files .

  • Доступ к корневому каталогу как портативного USB-накопителя (OTG), так и SD-карты.

  • Доступ на запись ко всем внутренним каталогам памяти, за исключением /Android/data/ , /sdcard/Android и большинства подкаталогов /sdcard/Android . Этот доступ на запись включает прямой доступ к путям к файлам .

    Приложения, которым предоставлено это разрешение, по-прежнему не могут получить доступ к каталогам , принадлежащим другим приложениям, поскольку эти каталоги отображаются как подкаталоги Android/data/ на томе хранения.

Если у приложения есть разрешение MANAGE_EXTERNAL_STORAGE , оно может получить доступ к этим дополнительным файлам и каталогам, используя либо API MediaStore , либо прямые пути к файлам . Однако при использовании Storage Access Framework доступ к файлу или каталогу возможен только в том случае, если разрешение MANAGE_EXTERNAL_STORAGE отсутствует.

Запустите функцию управления хранилищем другого приложения.

В Android 12 (уровень API 31) и выше приложения, имеющие одновременно разрешения MANAGE_EXTERNAL_STORAGE и QUERY_ALL_PACKAGES — например, приложения для управления файлами — могут использовать getManageSpaceActivityIntent() для перенаправления пользователей на пользовательскую активность управления пространством другого приложения.

Метод getManageSpaceActivityIntent() принимает имя пакета и код запроса и возвращает одно из следующих значений:

  • Если приложение с указанным именем пакета определило пользовательскую активность "управление пространством", то PendingIntent быть вызван, если оно имеет указанное имя пакета. Приложение для управления файлами, вызвавшее метод getManageSpaceActivityIntent() может затем вызвать возвращенный Intent, чтобы перенаправить пользователей на пользовательскую активность.
  • null , если приложение с указанным именем пакета не определяет действие "управление пространством".

Включите параметр MANAGE_EXTERNAL_STORAGE для тестирования.

Чтобы изучить, как разрешение MANAGE_EXTERNAL_STORAGE влияет на ваше приложение, вы можете включить это разрешение для тестирования. Для этого выполните следующую команду на компьютере, подключенном к вашему тестовому устройству:

adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow

Уведомление Google Play

В этом разделе размещено уведомление для разработчиков, публикующих приложения в Google Play.

Чтобы ограничить широкий доступ к общему хранилищу, магазин Google Play обновил свою политику и теперь оценивает приложения, ориентированные на Android 11 (уровень API 30) или выше, и запрашивает доступ ко всем файлам через разрешение MANAGE_EXTERNAL_STORAGE . Эта политика действует с мая 2021 года.

Если ваше приложение ориентировано на Android 11 или выше и объявляет разрешение MANAGE_EXTERNAL_STORAGE , Android Studio отображает предупреждение lint, показанное на рисунке 1. Это предупреждение напоминает вам о политике магазина Google Play, ограничивающей использование этого разрешения.

Рисунок 1. Предупреждение Lint в Android Studio, напоминающее разработчикам о политике Google Play в отношении разрешения MANAGE_EXTERNAL_STORAGE .

Запрашивайте разрешение MANAGE_EXTERNAL_STORAGE только в том случае, если ваше приложение не может эффективно использовать более дружественные к конфиденциальности API, такие как Storage Access Framework или Media Store API . Использование этого разрешения вашим приложением должно соответствовать разрешенным сценариям использования и быть напрямую связано с основной функциональностью приложения. Если ваше приложение включает в себя сценарий использования, аналогичный любому из следующих, вероятно, оно может запросить разрешение MANAGE_EXTERNAL_STORAGE :

  • файловые менеджеры
  • Резервное копирование и восстановление приложений
  • Антивирусные приложения
  • Приложения для управления документами
  • Поиск файлов на устройстве
  • Шифрование дисков и файлов
  • Миграция данных между устройствами