Большинство приложений, которым требуется доступ к общему хранилищу, могут следовать лучшим практикам для обмена медиафайлами и немедиафайлами . Однако некоторые приложения имеют основной сценарий использования, который требует широкого доступа к файлам на устройстве, но не могут получить к ним эффективный доступ с использованием лучших практик хранения, обеспечивающих конфиденциальность. Android предоставляет специальный доступ к приложению, называемый доступом ко всем файлам, для таких ситуаций.
Например, основной вариант использования антивирусного приложения может потребовать регулярного сканирования множества файлов в разных каталогах. Если это сканирование требует повторных действий пользователя для выбора каталогов с помощью системного средства выбора файлов, это обеспечивает плохой пользовательский опыт. Другие варианты использования, такие как приложения для управления файлами, приложения для резервного копирования и восстановления и приложения для управления документами, требуют аналогичных соображений.
Запросить доступ ко всем файлам
Приложение может запросить у пользователя доступ ко всем файлам, выполнив следующие действия:
- Объявите разрешение
MANAGE_EXTERNAL_STORAGE
в манифесте. - Используйте действие намерения
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 отображает предупреждение lint, показанное на рисунке 1. Это предупреждение напоминает вам о том, что в магазине Google Play действует политика, ограничивающая использование разрешения.
MANAGE_EXTERNAL_STORAGE
. Запрашивайте разрешение MANAGE_EXTERNAL_STORAGE
только тогда, когда ваше приложение не может эффективно использовать более дружественные к конфиденциальности API, такие как Storage Access Framework или Media Store API . Использование разрешения вашим приложением должно соответствовать разрешенным использованиям и должно быть напрямую связано с основными функциональными возможностями приложения. Если ваше приложение включает в себя вариант использования, аналогичный любому из следующих, вполне вероятно, что оно может запросить разрешение MANAGE_EXTERNAL_STORAGE
:
- Файловые менеджеры
- Резервное копирование и восстановление приложений
- Антивирусные приложения
- Приложения для управления документами
- Поиск файлов на устройстве
- Шифрование дисков и файлов
- Миграция данных с устройства на устройство