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

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

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

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

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

  1. Объявите разрешение MANAGE_EXTERNAL_STORAGE в манифесте.
  2. Используйте действие intent 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(), может затем вызвать возвращенное намерение, чтобы перенаправить пользователей к специальному действию.
  • 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 показывает предупреждение, как на рисунке 1. Это предупреждение напоминает вам, что в Google Play действуют правила, ограничивающие использование разрешения.

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

Запрашивайте разрешение MANAGE_EXTERNAL_STORAGE, только если в приложении нельзя использовать API, которые лучше защищают конфиденциальность, например платформу доступа к хранилищу или MediaStore API. Разрешение должно применяться только в определенных случаях и только для работы основных функций приложения. Если ваше приложение используется в целях, похожих на перечисленные ниже, то, скорее всего, оно может запрашивать разрешение MANAGE_EXTERNAL_STORAGE.