Android 11 (API уровня 30) расширяет возможности платформы, обеспечивая лучшую защиту данных приложений и пользователей на внешних накопителях. В этом выпуске представлен ряд улучшений, таких как доступ к необработанным путям к файлам, пакетное редактирование медиафайлов и обновлённый пользовательский интерфейс для Storage Access Framework.
В этом выпуске также предлагаются улучшения хранилища с ограниченной областью применения , что упрощает разработчикам реализацию своих сценариев использования хранилища после перехода на эту модель хранения.
Обеспечение соблюдения требований к хранению в рамках области действия
Приложения, работающие на Android 11, но ориентированные на Android 10 (уровень API 29), по-прежнему могут запрашивать атрибут requestLegacyExternalStorage
. Этот флаг позволяет приложениям временно отказаться от изменений, связанных с хранилищем с ограниченной областью действия, таких как предоставление доступа к различным каталогам и различным типам медиафайлов. После обновления приложения до Android 11 система игнорирует флаг requestLegacyExternalStorage
.
Поддерживать совместимость с Android 10
Если ваше приложение отказывается от использования хранилища в рамках области действия при работе на устройствах Android 10, рекомендуется сохранить установку requestLegacyExternalStorage
в true
в файле манифеста приложения. Таким образом, ваше приложение сможет работать ожидаемым образом на устройствах под управлением Android 10.
Переносите данные в каталоги, которые видны при использовании хранилища с ограниченной областью действия.
Если ваше приложение использует устаревшую модель хранилища и ранее было ориентировано на Android 10 или более ранние версии, возможно, вы храните данные в каталоге, к которому приложение не может получить доступ при включенной модели хранилища с ограниченной областью действия . Прежде чем переходить на Android 11, перенесите данные в каталог, совместимый с хранилищем с ограниченной областью действия.
Тестовое хранилище
Чтобы включить хранилище с ограниченной областью действия в вашем приложении, независимо от целевой версии SDK вашего приложения и значений флагов манифеста, включите следующие флаги совместимости приложения:
-
DEFAULT_SCOPED_STORAGE
(включено для всех приложений по умолчанию) -
FORCE_ENABLE_SCOPED_STORAGE
(по умолчанию отключено для всех приложений)
Чтобы отключить хранилище с заданной областью действия и вместо этого использовать устаревшую модель хранения, снимите оба флага.
Управление хранилищем устройства
Начиная с Android 11, приложения, использующие модель хранилища с ограниченной областью действия, могут получать доступ только к своим кэш-файлам. Если вашему приложению требуется управлять хранилищем устройства, следуйте инструкциям по запросу свободного места .
- Проверьте наличие свободного места, вызвав действие намерения
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 можно найти в следующих материалах: