Android 11 (API уровня 30) еще больше улучшает платформу, обеспечивая лучшую защиту данных приложений и пользователей на внешнем хранилище. Этот выпуск представляет несколько улучшений, таких как доступ к необработанному пути файла, пакетные операции редактирования для медиа и обновленный пользовательский интерфейс для Storage Access Framework.
В выпуске также предлагаются улучшения для хранилища с ограниченной областью действия , что упрощает разработчикам реализацию своих сценариев использования хранилища после перехода на использование этой модели хранения.
Обеспечение соблюдения требований к хранению данных
Приложения, работающие на Android 11, но нацеленные на Android 10 (уровень API 29), по-прежнему могут запрашивать атрибут requestLegacyExternalStorage
. Этот флаг позволяет приложениям временно отказаться от изменений, связанных с хранилищем scoped, например, от предоставления доступа к разным каталогам и разным типам медиафайлов. После обновления приложения для Android 11 система игнорирует флаг requestLegacyExternalStorage
.
Поддерживать совместимость с Android 10
Если ваше приложение отказывается от хранилища scoped при запуске на устройствах Android 10, рекомендуется продолжать устанавливать requestLegacyExternalStorage
в true
в файле манифеста вашего приложения. Таким образом, ваше приложение может продолжать вести себя ожидаемым образом на устройствах с Android 10.
Переносите данные в каталоги, которые видны при использовании хранилища с ограниченной областью действия.
Если ваше приложение использует устаревшую модель хранения и ранее было нацелено на Android 10 или ниже, вы можете хранить данные в каталоге, к которому ваше приложение не может получить доступ, когда включена модель хранилища с областью действия. Перед тем как нацеливаться на Android 11, перенесите данные в каталог, совместимый с хранилищем с областью действия.
Тестовое хранилище
Чтобы включить хранилище с ограниченной областью действия в вашем приложении, независимо от целевой версии SDK вашего приложения и значений флагов манифеста, включите следующие флаги совместимости приложения:
-
DEFAULT_SCOPED_STORAGE
(включено для всех приложений по умолчанию) -
FORCE_ENABLE_SCOPED_STORAGE
(по умолчанию отключено для всех приложений)
Чтобы отключить ограниченное хранилище и вместо него использовать устаревшую модель хранилища, снимите оба флага.
Управление хранилищем устройства
Начиная с Android 11, приложения, использующие модель хранилища scoped, могут получать доступ только к своим собственным файлам кэша, специфичным для приложения. Если вашему приложению необходимо управлять хранилищем устройства, следуйте инструкциям по запросу свободного места .
- Проверьте наличие свободного места, вызвав действие намерения
ACTION_MANAGE_STORAGE
. Если на устройстве недостаточно свободного места, предложите пользователю дать согласие приложению на очистку всех кэшей. Для этого вызовите действие намерения
ACTION_CLEAR_APP_CACHE
.
Каталог приложения на внешнем хранилище
Начиная с Android 11, приложения не могут создавать собственные каталоги приложений на внешнем хранилище . Чтобы получить доступ к каталогу, который система предоставляет для вашего приложения, вызовите getExternalFilesDirs()
.
Доступ к медиафайлам
Чтобы упростить доступ к мультимедиа, сохранив при этом конфиденциальность пользователей, в Android 11 добавлены следующие возможности.
Выполнение пакетных операций
Для обеспечения единообразия на всех устройствах и дополнительного удобства пользователя в Android 11 добавлено несколько методов, упрощающих управление группами медиафайлов .
Доступ к файлам с использованием прямых путей к файлам и собственных библиотек
Чтобы помочь вашему приложению работать более гладко со сторонними медиабиблиотеками, Android 11 позволяет вам использовать API, отличные от API MediaStore
, для доступа к медиафайлам из общего хранилища с использованием прямых путей к файлам . Эти API включают следующее:
- API
File
. - Собственные библиотеки, такие как
fopen()
.
Доступ к данным из других приложений
Для защиты конфиденциальности пользователей на устройствах под управлением Android 11 и выше система дополнительно ограничивает доступ вашего приложения к частным каталогам других приложений.
Доступ к каталогам данных на внутреннем хранилище
Android 9 (уровень API 28) начал ограничивать, какие приложения могут делать файлы в своих каталогах данных на внутреннем хранилище доступными для других приложений. Приложения, предназначенные для Android 9 или выше, не могут делать файлы в своих каталогах данных доступными для других приложений.
Android 11 расширяет это ограничение. Если ваше приложение предназначено для Android 11, оно не сможет получить доступ к файлам в каталоге данных любого другого приложения, даже если это другое приложение предназначено для Android 8.1 (уровень API 27) или ниже и сделало файлы в своем каталоге данных доступными для чтения всем.
Доступ к каталогам приложений на внешнем хранилище
В Android 11 приложения больше не могут получать доступ к файлам в выделенном каталоге другого приложения во внешнем хранилище.
Ограничения доступа к документам
Чтобы дать разработчикам время на тестирование, следующие изменения, связанные с Storage Access Framework (SAF), вступают в силу только в том случае, если ваше приложение предназначено для Android 11 или выше.
Доступ к каталогам
Вы больше не можете использовать действие намерения ACTION_OPEN_DOCUMENT_TREE
для запроса доступа к следующим каталогам:
- Корневой каталог внутреннего тома хранилища.
- Корневой каталог каждого тома SD-карты, который производитель устройства считает надежным , независимо от того, эмулируется ли карта или является съемной. Надежный том — это тот, к которому приложение может успешно получить доступ большую часть времени.
- Каталог
Download
.
Доступ к файлам
Вы больше не можете использовать действие намерения ACTION_OPEN_DOCUMENT_TREE
или ACTION_OPEN_DOCUMENT
, чтобы запросить у пользователя выбор отдельных файлов из следующих каталогов:
- Каталог
Android/data/
и все подкаталоги. - Каталог
Android/obb/
и все подкаталоги.
Проверьте изменение
Чтобы протестировать это изменение поведения, выполните следующие действия:
- Вызовите намерение с действием
ACTION_OPEN_DOCUMENT
. Проверьте, что каталогиAndroid/data/
иAndroid/obb/
не отображаются. - Выполните одно из следующих действий:
- Включите флаг совместимости приложения
RESTRICT_STORAGE_ACCESS_FRAMEWORK
. - Android 11 или выше.
- Включите флаг совместимости приложения
- Вызовите намерение с действием
ACTION_OPEN_DOCUMENT_TREE
. Убедитесь, что появился каталогDownload
, а кнопка действия, связанная с каталогом, неактивна.
Разрешения
В Android 11 внесены следующие изменения, связанные с разрешениями на хранение.
Нацельте любую версию
READ_EXTERNAL_STORAGE
.Следующие изменения вступают в силу в Android 11 независимо от целевой версии SDK вашего приложения:
- Разрешение среды выполнения «Хранилище» переименовано в «Файлы и медиа» .
Если ваше приложение не отказалось от ограниченного хранилища и запрашивает разрешение
READ_EXTERNAL_STORAGE
, пользователи увидят другое диалоговое окно по сравнению с Android 10. Диалоговое окно указывает, что ваше приложение запрашивает доступ к фотографиям и мультимедиа, как показано на рисунке 1.Пользователи могут видеть, какие приложения имеют разрешение
READ_EXTERNAL_STORAGE
в системных настройках. На странице Настройки > Конфиденциальность > Менеджер разрешений > Файлы и мультимедиа каждое приложение, имеющее разрешение, указано в разделе Разрешено для всех файлов . Если ваше приложение предназначено для Android 11, имейте в виду, что этот доступ ко «всем файлам» доступен только для чтения. Чтобы читать и записывать все файлы в общем хранилище с помощью этого приложения, вам необходимо иметь разрешение на доступ ко всем файлам .
Android 11
Если ваше приложение предназначено для Android 11, то разрешение WRITE_EXTERNAL_STORAGE
и привилегированное разрешение WRITE_MEDIA_STORAGE
больше не предоставляют никакого дополнительного доступа.
Помните, что на устройствах под управлением Android 10 (уровень API 29) или выше ваше приложение может вносить вклад в четко определенные коллекции мультимедиа, такие как MediaStore.Downloads
, не запрашивая никаких разрешений, связанных с хранилищем. Узнайте больше о том, как запрашивать только необходимые разрешения при работе с медиафайлами в вашем приложении.
Доступ ко всем файлам
Большинство приложений, которым требуется общий доступ к хранилищу, могут следовать лучшим практикам для обмена медиафайлами и немедиафайлами . Однако некоторые приложения имеют основной вариант использования, который требует широкого доступа к файлам на устройстве, но не могут сделать это эффективно, используя дружественные к конфиденциальности лучшие практики хранения. Android предоставляет специальный доступ к приложению, который называется Доступ ко всем файлам для таких ситуаций. Чтобы узнать больше, см. руководство по управлению всеми файлами на устройстве хранения.
Дополнительные ресурсы
Дополнительную информацию об изменениях в хранилище в Android 11 можно найти в следующих материалах: