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

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

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

Применение ограниченного хранилища: доступ к каталогам внешнего хранилища ограничен каталогом для конкретного приложения и определенными типами носителей, созданных приложением.

Автоматический сброс разрешений: если пользователи не взаимодействовали с приложением в течение нескольких месяцев, система автоматически сбрасывает конфиденциальные разрешения приложения.

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

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

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

Структура хранилища (до Android 10)

Прежде чем переходить к части реализации, давайте сначала разберемся, как были организованы данные до Android 10:

  • Частное хранилище: у всех приложений есть собственный личный каталог во внутреннем хранилище, т. е. Android / data / {package name}, который не виден другим приложениям.
  • Общее хранилище. Помимо частного хранилища, остальное хранилище называлось общим хранилищем. Это включает в себя все хранящиеся медиафайлы и файлы, не относящиеся к медиафайлам, и приложение с разрешением на хранение может легко получить к ним доступ.

Проблемы с текущей структурой и доступом

Видите ли вы какие-либо проблемы с этой структурой или что-то, что вы когда-либо хотели, чтобы Google изменил?

Позвольте мне остановиться на некоторых проблемах:

  • Если я являюсь приложением для электронной коммерции, мне нужен доступ к хранилищу только для того, чтобы попросить пользователя загрузить изображение своего профиля, что означает доступ к определенному файлу или файловой системе. Вы можете взять другой пример: приложение чата, в которое я хочу загрузить мультимедиа или записать мультимедийный файл в систему, что означает доступ к одному мультимедийному файлу. Так почему я прошу доступ ко всему хранилищу?
  • Вы когда-нибудь беспокоились о том, что ваши конфиденциальные данные, такие как медицинские рецепты или банковские документы, будут доступны для всех приложений, установленных на вашем устройстве?
  • Если я удаляю приложение и нуждаюсь в данных / файлах, связанных с ним с того времени, когда я использовал приложение, есть ли у меня простой способ убрать весь беспорядок?

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

Ограниченное хранилище

Идея

Google приводит две веские причины, по которым он вносит это изменение: безопасность и уменьшение ненужного "беспорядка в приложениях".

Песочница приложений - это основная часть дизайна Android, изолирующая приложения друг от друга. В Android Q, взяв тот же фундаментальный принцип из изолированной программной среды приложений, Google представил хранилище с ограниченным доступом.

Эти изменения изначально планировалось применить к каждому приложению на телефоне под управлением Android 10 или более поздней версии, но из-за негативной реакции разработчиков Google изменил курс и потребовал использовать Scoped Storage только для приложений, ориентированных на Android API уровня 29, то есть Android 10. Но с «Android 11 Scoped Storage возвращается, и Google вряд ли изменит свое мнение на этот раз ». - Что такое Scoped Storage в Android 11?

  • Лучшая атрибуция: приложению будет предоставлен доступ к блокам хранения, в которых есть соответствующие данные для приложения.

Посмотрите на структуру хранилища в Android 10 и более поздних версиях:

Теперь частное хранилище такое же, как и раньше, но общее хранилище делится на мультимедийную и загружаемую (не мультимедийные файлы) коллекцию.

Вау, теперь это кажется чем-то крутым, не так ли?

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

Изменения разрешений на доступ к файлам

  • Неограниченный доступ к своему индивидуальному хранилищу приложений: a pp будет иметь неограниченный доступ к внутреннему и внешнему хранилищу для операций чтения и записи. С Android 10 вам не нужно предоставлять разрешение на хранение для записи файлов в собственный каталог приложения на SD-карте.
  • Неограниченный доступ к медиафайлам и загружаемым коллекциям (добавлен): у вас есть неограниченный доступ для добавления файлов в медиаколлекции и загрузок вашего собственного приложения. Нет необходимости иметь разрешение, если вы хотите сохранить любое изображение, видео или любой другой медиафайл в коллекции мультимедиа (если файл хранится в организованной коллекции).
  • Доступ к коллекции мультимедиа, предоставленной другими приложениями, можно получить с помощью разрешения READ_STORAGE_PERMISSION. Разрешение WRITE_STORAGE_PERMISSION будет устаревшим в следующей версии и, если оно будет использоваться, будет работать так же, как READ_STORAGE_PERMISSION.
  • Не-мультимедийным файлам, предоставленным другими приложениями, потребуются API фреймворка доступа к хранилищу для чтения, а также для операций записи.

ПРИМЕЧАНИЕ. Если ваше приложение использует устаревшую модель хранилища и ранее нацелено на Android 10 или ниже, вы можете хранить данные в каталоге, к которому ваше приложение не может получить доступ, когда включена модель« хранилища с ограниченным объемом . Прежде чем настраивать таргетинг на Android 11, перенесите данные в каталог, совместимый с ограниченным хранилищем. В большинстве случаев вы можете перенести данные в каталог приложения. - Обновления хранилища в Android 11

Woohoo !! Более конкретные разрешения. Теперь я счастлив и чувствую себя в большей безопасности.

Отказ от приложений, предназначенных для Android 10 и более поздних версий

С сайта разработчиков Android:

«Чтобы дать разработчикам дополнительное время для тестирования, приложения, ориентированные на Android 10 (уровень API 29), по-прежнему могут запрашивать атрибут requestLegacyExternalStorage. Этот флаг позволяет приложениям временно отказаться от изменений, связанных с ограниченным хранилищем, таких как предоставление доступа к разным каталогам и различным типам мультимедийных файлов ».

Согласно Что такое Scoped Storage в Android 11?:

«Любое приложение, предназначенное для Android 11 или более поздней версии, должно использовать новые API хранилища, в том числе хранилище с ограниченным объемом. Изменения в соглашении с разработчиками Google Play гласят, что начиная с 1 августа 2020 года все новые приложения, представленные в Google Play, должны быть нацелены на Android 10 или более поздней версии, а все обновления существующих приложений должны быть нацелены на Android 10 или более позднюю версию с 1 ноября 2020 года. поведения, и в следующем году, вероятно, потребуются приложения для Android 11 ».

Это время. Изучите, поймите и реализуйте это.

Хранение

Позвольте мне кратко описать некоторые часто выполняемые операции хранения и способы их выполнения:

  • Выберите файл: используйте ACTION_OPEN_DOCUMENT, чтобы затем открыть системное приложение для выбора файлов, чтобы пользователь мог выбрать файл для открытия. Чтобы отображать только те типы файлов, которые поддерживает ваше приложение, укажите тип MIME.

Примечание. Этот доступ будет действителен до тех пор, пока пользователь не перезагрузит устройство. Если приложение хочет сохранить доступ при доступе к URI с помощью преобразователя контента, преобразователь контента должен вызвать метод takePersistableUriPermission.

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

  • Создание файла: используйте ACTION_CREATE_DOCUMENT, чтобы сохранить файл в определенном месте.

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

Подождите, я не могу получить метаданные, то есть местоположение моего изображения. Это изменилось? Как я могу это получить?

Разрешение на размещение мультимедиа

Как сказано в документации разработчика Android:

«Если ваше приложение нацелено на Android 10 (уровень API 29) или выше, для того, чтобы ваше приложение могло извлекать неотредактированные метаданные Exif из фотографий, вам необходимо объявить разрешение ACCESS_MEDIA_LOCATION в манифесте приложения, а затем запросить это разрешение во время выполнения».

Внимание! Поскольку вы запрашиваете ACCESS_MEDIA_LOCATION разрешение во время выполнения, нет гарантии, что ваше приложение имеет доступ к неотредактированным метаданным Exif с фотографий. Ваше приложение требует явного согласия пользователя, чтобы получить доступ к этой информации ». - Документация разработчика Android

Тип файлового менеджера для резервного копирования приложений

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

«Приложение может запросить у пользователя специальный доступ к приложению под названием« Доступ ко всем файлам », выполнив следующие действия:

1. Объявите разрешение MANAGE_EXTERNAL_STORAGE в манифесте.

2. Используйте действие ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION intent, чтобы направить пользователей на страницу настроек системы, где они могут включить следующую опцию для вашего приложения: Разрешить доступ для управления всеми файлами ».

Законным приложениям требуются эти специальные разрешения.

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

Только приложения, предоставленные Google, будут иметь полный доступ к хранилищу. Для этого отправьте форму декларации в Google Play и попадите в одобренный список.

Приложения, использующие настраиваемое средство выбора файлов

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

Что нужно помнить во время реализации

  1. Не используйте статический путь. Заблокируйте доступ к пути к файлу.
  2. Воспользуйтесь медиа магазином (рекомендуется).
  3. Медиа-магазин следует использовать правильно. Например, не помещайте музыкальные файлы в каталог с изображениями.
  4. Не мультимедийные файлы должны находиться в каталоге загрузки (рекомендуется).
  5. Чтобы получить доступ к немедиафайлам из других приложений, используйте системный сборщик с SAF (структура доступа к хранилищу). Для полного доступа к этому приложению будет запрошено разрешение выполнения.

Вы можете ознакомиться с примером реализации на Github здесь:



Первоначально опубликовано здесь.

использованная литература

Это все с моей стороны для этой статьи. Надеюсь, вы кое-что узнали. Если вы знаете что-нибудь еще, оставьте, пожалуйста, комментарий, чтобы мы все вместе учились.