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

Большинство приложений, которым требуется доступ к общему хранилищу, могут следовать рекомендациям по совместному использованию мультимедийных файлов и совместному использованию немедиафайлов . Однако у некоторых приложений есть основной вариант использования, который требует широкого доступа к файлам на устройстве, но не может эффективно получить к ним доступ, используя рекомендации по обеспечению конфиденциальности хранилища. В таких ситуациях 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() может затем вызвать возвращенное намерение, чтобы отправить пользователей к настраиваемому действию.
  • 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, такие как Storage Access Framework или API Media Store . Использование разрешения вашим приложением должно подпадать под разрешенные виды использования и должно быть напрямую связано с основными функциями приложения. Если ваше приложение включает вариант использования, аналогичный любому из следующих, вполне вероятно, что оно может запросить разрешение MANAGE_EXTERNAL_STORAGE :

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