Перейти к содержанию
ERITKOM
МобильныеРазбор

Photo Picker на Android: выбранная фотография, ограниченный URI и облачный источник

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

Последовательность обмена между приложением, Photo Picker и облачным медиапровайдером
Android Open Source Project · CC BY 2.5 · Изменены размер и формат.

Выбор файла не равен разрешению на всю библиотеку

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

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

Контракт результата скрывает несколько системных маршрутов

Jetpack Activity предоставляет PickVisualMedia для одного объекта и PickMultipleVisualMedia для нескольких. Запрос может ограничиваться изображениями, видео, обоими типами или отдельным MIME-типом. Контракт сначала предпочитает штатный Photo Picker, а при его отсутствии использует предусмотренные платформой резервные обработчики. Последним запасным маршрутом служит ACTION_OPEN_DOCUMENT на поддерживаемых устройствах начиная с API 19.

Поэтому одинаковый вызов библиотеки не гарантирует идентичное окно на всех телефонах. Меняются обработчик и его доступные свойства. Документация отдельно отмечает, что ограничение количества объектов при переходе к ACTION_OPEN_DOCUMENT может не соблюдаться системным интерфейсом. Возвращённый URI является доступом для чтения, а не обещанием возможности изменить оригинал. Контракт унифицирует способ получения результата, но не превращает все файловые провайдеры и версии Android в одну реализацию с абсолютно одинаковыми ограничениями.

Диалог Android с полным, частичным доступом к медиа и отказом
Диалог Android с полным, частичным доступом к медиа и отказом. Android Open Source Project · CC BY 2.5 · Изменены размер и формат.

URI обозначает доступ, а не обычный путь на диске

Content URI передаёт ссылку на объект через ContentResolver. За ней может находиться системный медиапровайдер, другой процесс или облачное содержимое. Поэтому такая ссылка не обязана соответствовать файлу, который можно открыть обычной операцией по строковому пути. Код, получающий изображение, работает с потоком или файловым дескриптором и условиями провайдера.

Разрешение имеет срок и назначение. Для длительной фоновой операции документация Photo Picker описывает сохранение доступа через takePersistableUriPermission. Это сохраняет право обращения, но не создаёт независимую резервную копию снимка. Удаление исходного объекта и изменение доступности провайдера остаются отдельными событиями. В Storage Access Framework аналогично различаются выбранный документ, разрешённые операции и фактическое существование ресурса. Сам факт сохранения URI в базе приложения не доказывает, что через месяц его содержимое останется доступным.

Разные модели доступа к изображениям Android
МеханизмПредмет доступаКто выбирает объект
Photo Picker URI выбранных изображений или видео Пользователь в системном интерфейсе
Собственная галерея и Selected Photos Access Доступная приложению часть MediaStore Пользователь задаёт разрешённый набор
MediaStore с соответствующими разрешениями Коллекции общих медиа Приложение в пределах текущих полномочий
FileProvider с временным grant Ограниченный URI файла отправителя Отправляющее приложение в сценарии обмена

Источник: Android Developers: Photo Picker и связанные руководства

Частичный доступ Android 14 относится к другой модели

Selected Photos Access появился для приложений, работающих с разрешениями медиабиблиотеки. Пользователь может предоставить полный доступ, отказать либо ограничить доступ выбранным набором. Для собственной галереи предусмотрено READ_MEDIA_VISUAL_USER_SELECTED и повторный выбор. Это не то же самое, что однократный контракт системного Photo Picker: в первом случае приложение само строит интерфейс библиотеки и запрашивает её доступную часть.

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

Повторный выбор доступных фотографий в Android
Повторный выбор доступных фотографий в Android. Android Open Source Project · CC BY 2.5 · Изменены размер и формат.

Облачный снимок проходит через посредника платформы

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

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

MediaStore нужен там, где приложение действительно управляет коллекцией

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

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

Передача фотографии дальше создаёт отдельное разрешение

Если после выбора снимок передаётся редактору или другому приложению, возникает ещё одна граница доступа. Руководство по обмену файлами описывает content URI и временные права для получателя; FileProvider предоставляет такую схему для файлов, которыми владеет отправляющее приложение. Это отличается от публикации полного локального пути или выдачи постоянного доступа ко всему каталогу.

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

Источники

Принципы журнала и исправления.

ERITKOM / НОВЫЙ ПРОЕКТ

Расскажите о задаче и оставьте контакты. Мы свяжемся с вами, чтобы обсудить проект.

  1. 01 Контакты
  2. 02 Ваша задача