Обновления хранилища в 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. Если на устройстве недостаточно свободного места, попросите пользователя разрешить приложению очистить кеш. Для этого вызовите действие intent ACTION_CLEAR_APP_CACHE.

Каталог приложения во внешнем хранилище

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

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

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

Выполнить серию операций

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

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

Чтобы упростить работу приложения со сторонними медиатеками, в Android 11 можно использовать не только 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.

Доступ к файлам

Вы больше не можете использовать действие intent ACTION_OPEN_DOCUMENT_TREE или ACTION_OPEN_DOCUMENT, чтобы запрашивать у пользователя выбор отдельных файлов из следующих каталогов:

  • Каталог Android/data/ и все его подкаталоги.
  • Каталог Android/obb/ и все его подкаталоги.

Протестируйте изменение

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

  1. Вызовите намерение с помощью действия 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 можно найти в следующих материалах:

Записи в блоге

Видео