Нельзя отправить файлы из внешнего хранилища

Обновлено: 02.07.2024

Google Play ограничивает использование важных разрешений и разрешений с высоким уровнем риска, в том числе доступ ко всем файлам для приложений.Это касается только приложений, предназначенных для Android 11 (API уровня 30) и запрашивающих разрешение MANAGE_EXTERNAL_STORAGE , которое было добавлено в Android 11. Эти правила не влияют на использование разрешения READ_EXTERNAL_STORAGE .

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

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

Если вы не подадите декларацию или не приведете приложение в соответствие с требованиями, мы можем удалить его из Google Play.

Когда можно запрашивать разрешение на доступ ко всем файлам

Запрашивать доступ ко всем файлам можно, только если нет альтернативных способов работы с файлами, более безопасных для конфиденциальности пользователей (таких как платформа доступа к хранилищу или MediaStore API).

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

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

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

Использование

Допустимое разрешение*

Управление файлами

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

Резервное копирование и восстановление

Работа приложения невозможна без автоматического доступа к различным каталогам за пределами предназначенного для него хранилища.

Защита от вирусов

Основные функции приложения – сканирование устройства и защита от вирусов.

Управление документами

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

Поиск (на устройстве)

Основная функция приложения – поиск по файлам и папкам во внешнем накопителе устройства.

Шифрование и блокировка диска или папок

Основная функция приложения – шифрование файлов и папок.

Перенос данных

Основная функция приложения – помощь при переходе на новое устройство.


*Декларация с этими разрешениями должна быть рассмотрена и одобрена командой Google Play.

Google Play может делать временные исключения для приложений, которые не относятся к перечисленным выше категориям, если:

  1. Разрешение используется для работы основных функций приложения.
  2. Других способов обеспечить работу приложения не существует или

использование альтернативных способов, более безопасных для конфиденциальности (например, MediaStore API или платформы доступа к хранилищу), наносит серьезный ущерб работе основных функций приложения.

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

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

Примечание. Перечисленные выше разрешения могут запрашиваться не только критически важными службами, но и приложениями операторов или сервисами OEM, а также частными приложениями, опубликованными на платформе корпоративный Google Play.

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

Ниже приведен список распространенных примеров использования, когда разрешение на доступ ко всем файлам ( MANAGE_EXTERNAL_STORAGE ) предоставляться не будет:

  • Доступ к медиафайлам (см. раздел Альтернативы ниже).
  • Любой выбор файлов, в ходе которого пользователь вручную указывает отдельные файлы (см. раздел Альтернативы ниже).

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

Использование

Альтернативы

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

MediaStore API позволяет приложениям просматривать медиафайлы на внешнем накопителе и взаимодействовать с ними, не запрашивая доступ ко всем файлам.

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

Обычно карта памяти работает без проблем, но иногда система сообщает, что нет доступа к SD-карте Xiaomi. Почему так происходит и что с этим делать? Давайте разбираться вместе.

Способ №1

Вероятная проблема – засорение контактов карточки памяти. Для их чистки требуется извлечь аксессуар из телефона, который предварительно отключается. С помощью скрепки, которая идет в комплекте поставки, нужно достать лоток с СИМ-картами и извлечь нужный нам девайс.

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

Способ №2

Речь идет о виртуальном отключении, что поможет при наличии системной ошибки. Для этого зайдите в «Настройки» - «О телефоне» - «Хранилище». Одним из пунктов будет «Извлечь SD-карту». Нажимаем на него – и спустя пару секунд карточка памяти оказывается виртуально извлеченной.

Пошаговая инструкция по извлечению SD-карты на Xiaomi

Снова нажимаем на ее подключение, после чего устройство должно работать нормально.

Способ №3

В левой верхней части вы увидите изображение трех горизонтальных линий. Нажимаем на них и выбираем строку «SD-карта» и даем согласие на все запросы системы.

Способ №4

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

На следующем этапе выбирается в настройках строка «О телефоне», затем «Хранилище», а потом пункт «Форматировать SD-карту». Система спросит, точно ли вы хотите совершить это действие. Дайте свое согласие и подождите несколько минут до завершения процесса.

Также рекомендуется проверить, есть ли доступ к памяти у загрузок. Если нет, то нужно предоставить его.

Если ни один из вышеперечисленных способов не помог, то для доступа к SD на Xiaomi придется установить новую карту памяти.

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

Ранее внешним хранилищем назывался раздел диска на съемном носителе, таком как SD-карта (также известном как переносное устройство). Это различие уже неактуально, так как устройства Android существенно изменились и многие устройства Android больше не поддерживают съемные носители. Вместо этого некоторые устройства будут выделять часть внутренней энергонезависимой памяти, которую Android использует для выполнения той же функции съемного носителя. Это называется эмулированным хранилищем и по-прежнему считается внешним. Кроме того, у некоторых устройств Android может быть несколько внешних разделов хранилища. Например, в планшете Android (помимо его внутреннего хранилища) может быть эмулированное хранилище и один или несколько слотов для SD-карты. Все эти разделы рассматриваются Android как внешнее хранилище.

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

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

Общедоступные и частные файлы во внешнем хранилище

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

Частные файлы — это файлы, зависящие от приложения (но все еще доступные всем для чтения и записи). В Android предполагается, что частные файлы хранятся в определенном каталоге во внешнем хранилище. Несмотря на то, что файлы называются "частными", они по-прежнему видимы и доступны для других приложений на устройстве, Android не предоставляет им специальные меры защиты.

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

Частные внешние файлы

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

В этом документе будут ссылки на каталог хранилища частных файлов во внешнем хранилище как на PRIVATE_EXTERNAL_STORAGE.

Параметр для GetExternalFilesDir() представляет собой строку, которая указывает каталог приложения. Этот каталог предназначен для стандартного расположения в логической организации файлов. Строковые значения доступны через константы класса Android.OS.Environment :

Android.OS.Environment Каталог
DirectoryAlarms PRIVATE_EXTERNAL_STORAGE/Alarms
DirectoryDcim PRIVATE_EXTERNAL_STORAGE/DCIM
DirectoryDownloads PRIVATE_EXTERNAL_STORAGE/Download
DirectoryDocuments PRIVATE_EXTERNAL_STORAGE/Documents
DirectoryMovies PRIVATE_EXTERNAL_STORAGE/Movies
DirectoryMusic PRIVATE_EXTERNAL_STORAGE/Music
DirectoryNotifications PRIVATE_EXTERNAL_STORAGE/Notifications
DirectoryPodcasts PRIVATE_EXTERNAL_STORAGE/Podcasts
DirectoryRingtones PRIVATE_EXTERNAL_STORAGE/Ringtones
DirectoryPictures PRIVATE_EXTERNAL_STORAGE/Pictures

Для устройств с несколькими разделами во внешнем хранилище каждый раздел будет содержать каталог, предназначенный для частных файлов. Метод Android.Content.Context.GetExternalFilesDirs(string type) возвращает массив Java.IO.Files . Каждый объект будет представлять частный каталог приложения для всех совместно используемых устройств с внешними хранилищами, где приложение может размещать принадлежащие ему файлы.

Точный путь к частному каталогу внешнего хранилища может отличаться в зависимости от устройства и версии Android. По этой причине приложения не должны жестко задавать путь к этому каталогу. Вместо этого они должны использовать API-интерфейсы Xamarin.Android, например Android.Content.Context.GetExternalFilesDir() .

Общедоступные внешние файлы

Общедоступные файлы — это файлы, которые существуют во внешнем хранилище и не хранятся в каталоге, который Android выделяет для частных файлов. Общедоступные файлы не удаляются при удалении приложения. Приложения Android должны получить разрешение, прежде чем они смогут считывать или записывать любые общедоступные файлы. Общедоступные файлы могут существовать везде во внешнем хранилище, но по соглашению в Android предусматривается, что общедоступные файлы будут существовать в каталоге, указанном свойством Android.OS.Environment.ExternalStorageDirectory . Это свойство будет возвращать объект Java.IO.File , который представляет основной каталог во внешнем хранилище. В качестве примера Android.OS.Environment.ExternalStorageDirectory может ссылаться на следующий каталог:

В этом документе будут ссылки на каталог хранилища общедоступных файлов во внешнем хранилище как на PUBLIC_EXTERNAL_STORAGE.

Android также поддерживает концепцию каталогов приложений для PUBLIC_EXTERNAL_STORAGE. Эти каталоги в точности совпадают с каталогами приложений для PRIVATE_EXTERNAL_STORAGE и описаны в таблице в предыдущем разделе. Метод Android.OS.Environment.GetExternalStoragePublicDirectory(string directoryType) возвращает объект Java.IO.File , который соответствует общедоступному каталогу приложения. Параметр directoryType является обязательным и не может иметь значение null .

Например, вызов Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDocuments).AbsolutePath вернет строку, которая будет выглядеть так:

Точный путь к общедоступному каталогу во внешнем хранилище может отличаться в зависимости от устройства и версии Android. По этой причине приложения не должны жестко задавать путь к этому каталогу. Вместо этого они должны использовать API-интерфейсы Xamarin.Android, например Android.OS.Environment.ExternalStorageDirectory .

Работа с внешним хранилищем

  1. Проверка внешнего хранилища. В зависимости от характера внешнего хранилища существует возможность, что оно не будет подключено и не будет использоваться приложением. Все приложения должны проверять состояние внешнего хранилища, прежде чем пытаться его использовать.
  2. Выполнение проверки разрешений во время выполнения. Приложение Android должно запросить разрешение у пользователя для доступа к внешнему хранилищу. Это означает, что запрос на разрешение во время выполнения должен быть сделан до осуществления любого доступа к файлу. Руководство Разрешения в Xamarin.Android содержит более подробные сведения о разрешениях Android.

Каждая из этих двух задач будет описана ниже.

Проверка доступности внешнего хранилища

Первым действием перед записью во внешнее хранилище является проверка его доступности для чтения или записи. Свойство Android.OS.Environment.ExternalStorageState содержит строку для определения состояния внешнего хранилища. Это свойство будет возвращать строку, которая представляет состояние. Эта таблица представляет собой список значений ExternalStorageState , которые могут быть возвращены Environment.ExternalStorageState :

ExternalStorageState Описание
MediaBadRemoval Носитель внезапно удален без отключения надлежащим образом.
MediaChecking Носитель присутствует, но проходит проверку диска.
MediaEjecting Носитель пребывает в процессе отключения и извлечения.
MediaMounted Носитель подключен, в нем можно выполнять операции чтения и записи.
MediaMountedReadOnly Носитель подключен, но в нем можно выполнять только операции чтения.
MediaNofs Носитель присутствует, но не содержит файловой системы, подходящей для Android.
MediaRemoved Носитель отсутствует.
MediaShared Носитель присутствует, но не подключен. Его использует через USB-порт другое устройство.
MediaUnknown Состояние носителя не распознано Android.
MediaUnmountable Носитель присутствует, но его не удалось подключить к Android.
MediaUnmounted Носитель присутствует, но отключен.

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

Разрешения внешнего хранилища

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

Все приложения Android должны объявить одно из двух разрешений для внешнего хранилища в AndroidManifest.xml. Чтобы определить разрешения, один из следующих двух элементов uses-permission должен быть добавлен в AndroidManifest.xml:

Если пользователь предоставил разрешение WRITE_EXTERNAL_STORAGE , то также неявно предоставляется и READ_EXTERNAL_STORAGE . Нет необходимости запрашивать оба разрешения в AndroidManifest.xml.

Разрешения также можно добавить на вкладке Манифест Android в разделе свойств решения:

Обозреватель решений — необходимые разрешения для Visual Studio

Разрешения также можно добавить с помощью вкладки Манифест Android на панели свойств решения:

Панель решения — необходимые разрешения для Visual Studio для Mac

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


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

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

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

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

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

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

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

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


  • Частное хранилище (Private Storage): все приложения имеют собственный частный каталог во внутреннем хранилище, то есть Android/data/, невидимый для других приложений.
  • Общее хранилище (Shared Storage): остальная часть хранилища, помимо частных разделов, называлась общим хранилищем. Оно включает в себя все медиа- и немедийные файлы, сохраненные в системе, и приложение с разрешением на хранение может легко получить к ним доступ.

Есть ли , на ваш взгляд, какие-то проблемы в структуре, которую мы рассмотрели выше? Не хотелось ли вам, чтобы Google что-нибудь здесь изменил?

Давайте подробнее остановимся на некоторых проблемах.

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

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

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

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

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

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

Посмотрите на структуру хранения данных в Android 10 и выше:


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

  • Уменьшение беспорядка в файлах: система свяжет хранилище с приложениями-владельцами, чтобы системе было легче находить файлы, относящиеся к приложению. Таким образом, при удалении приложения все связанные с ним данные также будут удалены.
  • Предотвращение злоупотребления разрешением READ_EXTERNAL_STORAGE: предоставление этого разрешения на сегодняшний день дает приложению доступ ко всему внешнему хранилищу, где хранятся личные фотографии, документы, видео и другие потенциально конфиденциальные файлы. Однако при применении Scoped storage приложения смогут видеть только собственные папки данных и определенные типы носителей, такие как музыкальные файлы, используя другие API хранилища.

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также: