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 включают в себя следующее:
-
File
API. - Собственные библиотеки, такие как
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 можно узнать из следующих материалов: