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

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

Видео