Обновления хранилища в Android 11

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 и значений флагов манифеста, включите следующие флаги совместимости приложения:

Чтобы отключить ограничение области действия хранилища и использовать вместо этого устаревшую модель хранения, снимите оба флага.

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

Начиная с Android 11, приложения, использующие модель ограниченного доступа к хранилищу, могут получать доступ только к собственным кэш-файлам. Если вашему приложению необходимо управлять хранилищем устройства, следуйте инструкциям по запросу свободного места .

  1. Проверьте наличие свободного места, вызвав действие ACTION_MANAGE_STORAGE .
  2. Если на устройстве недостаточно свободного места, предложите пользователю дать согласие на очистку всех кэшей вашего приложения. Для этого вызовите действие интента ACTION_CLEAR_APP_CACHE .

Каталог, специфичный для приложения, на внешнем хранилище.

Начиная с Android 11, приложения не могут создавать собственные каталоги на внешних носителях . Чтобы получить доступ к каталогу, предоставленному системой для вашего приложения, вызовите метод getExternalFilesDirs() .

доступ к медиафайлам

Для упрощения доступа к медиаконтенту при сохранении конфиденциальности пользователей в Android 11 добавлены следующие возможности.

Выполняйте пакетные операции.

Для обеспечения единообразия на разных устройствах и дополнительного удобства для пользователей Android 11 добавляет несколько методов, упрощающих управление группами медиафайлов .

Доступ к файлам осуществляется с помощью прямых путей к файлам и собственных библиотек.

Чтобы ваше приложение работало более плавно с медиатеками сторонних разработчиков, Android 11 позволяет использовать API, отличные от MediaStore API, для доступа к медиафайлам из общего хранилища с помощью прямых путей к файлам . К таким 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/ и все его подкаталоги.

Проверьте изменения

Чтобы проверить это изменение в поведении, выполните следующие действия:

  1. Вызовите Intent с действием ACTION_OPEN_DOCUMENT . Убедитесь, что каталоги Android/data/ и Android/obb/ не отображаются.
  2. Выполните одно из следующих действий:
    • Включите флаг совместимости приложений RESTRICT_STORAGE_ACCESS_FRAMEWORK .
    • Целевая платформа: Android 11 или выше.
  3. Вызовите интент с действием ACTION_OPEN_DOCUMENT_TREE . Убедитесь, что отображается каталог Download , а кнопка действия, связанная с этим каталогом, неактивна (заблокирована).

Разрешения

В Android 11 внесены следующие изменения, касающиеся разрешений на доступ к хранилищу.

Нацелить на любую версию

В первом диалоговом окне отображается ссылка «Разрешить в настройках».
Рисунок 1. Диалоговое окно, отображаемое при использовании приложением хранилища с ограниченной областью видимости и запросе разрешения 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 ознакомьтесь со следующими материалами:

Сообщения в блоге

Видео