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

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

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

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

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

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

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

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

  1. Вызовите намерение с действием ACTION_OPEN_DOCUMENT . Проверьте, что каталоги Android/data/ и Android/obb/ не отображаются.
  2. Выполните одно из следующих действий:
  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 можно найти в следующих материалах:

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

Видео