Модуль MediaProvider оптимизирует индексированные метаданные (аудио, видео и изображения с SD-карт и USB-устройств) и делает эти данные доступными для приложений через публичные API MediaStore . Для сохранения конфиденциальности пользователей модуль MediaProvider применяет модель безопасности хранилища с областью действия, представленную в Android 10, которая включает редактирование конфиденциальных метаданных местоположения. Этот модуль можно обновлять, что позволяет Android быстрее реагировать на проблемы безопасности (сохраняя конфиденциальные данные пользователя защищенными) и быстрее добавлять новые форматы мультимедиа (обеспечивая согласованность как для пользователей, так и для разработчиков).
Изменения в Android 10
В Android 10 представлено несколько улучшений, связанных с идентификацией и извлечением данных из медиафайлов, в частности:
Определение типа содержимого файла с использованием первой части типа MIME файла. Например, ОС знает, что и
image/png
, иimage/x-newly-invented-format
являются изображениями, и может, таким образом, точно описать соответствующие разрешения для конечного пользователя.Определение типа MIME только по расширению файла (и без использования анализа содержимого во избежание проблем безопасности).
Определение типа MIME произвольного файла с использованием комбинации сопоставлений Debian Linux и Android .
Возврат соответствующих данных из файлов
video/*
иaudio/*
(черезMediaMetadataRetriever
) и файловimage/*
(черезExifInterface
).
Изменения в Android 11
В Android 11 модуль MediaProvider основан на изменениях, внесенных в Android 10, и имеет следующие улучшения:
Улучшения индексации. Модуль MediaProvider теперь индексирует метаданные, сверяя доступные метаданные с публичными API MediaStore. Изменения включают:
Новый столбец
is_favorite
и аргументQUERY_ARG_MATCH_FAVORITE
позволяют приложениям в стиле галереи быстро фильтровать медиафайлы на основе этого столбца.Индексация метаданных цветового пространства.
Новый столбец «is_trashed» и аргумент
QUERY_ARG_MATCH_TRASHED
позволяют приложениям в стиле галереи выполнять фильтрацию на основе этого столбца.Новые API, которые позволяют выполнять пакетное изменение нескольких элементов с помощью одного диалогового окна пользователя, включая
createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
иcreateWriteRequest()
.Новые столбцы
GENERATION_ADDED
иGENERATION_MODIFIED
для быстрого и надежного обнаружения изменений, произошедших с момента предыдущей точки синхронизации.Новый общедоступный API
GROUP BY
для использования с дополнительными столбцами метаданных, не упомянутыми выше.
Улучшение
ExifInterface
для извлечения метаданных из контейнеров PNG и WebP.Улучшения
SystemUI
для записи метаданныхDateTimeOriginal
в снимках экрана.
Кроме того, теперь вы можете настраивать MediaProvider, добавляя новые форматы медиа, отмечая, какие устройства хранения должны быть проиндексированы, и даже заменяя стек MTP. Подробности см. в разделе Настройка .
Граница модуля
Android 11 переносит весь код в packages/providers/MediaProvider
в новое место, за исключением логики, связанной с MTP. Кроме того, frameworks/base/core/java/android/provider/MediaStore.java
теперь находится внутри границы модуля в packages/providers/MediaProvider
.
Формат упаковки
Модуль MediaProvider имеет формат APK-in-APEX.
Зависимости
Зависимости MediaProvider связаны с настройками (то есть, если вы настраиваете MediaProvider, вы должны убедиться, что ваша реализация соответствует зависимости, связанной с вашей настройкой).
При использовании пользовательских или нестандартных форматов медиафайлов (например, формата, созданного приложением Camera определенного поставщика) необходимо зарегистрировать каждый пользовательский формат в
MimeUtils
и модуле Media Extractor, чтобы включить индексацию с помощью MediaProvider.Чтобы гарантировать, что MediaProvider индексирует пользовательский набор устройств хранения данных (например, слоты для SD-карт и порты USB), используемых в реализации
StorageManagerService
, установите флагVolumeInfo.MOUNT_FLAG_INDEXABLE
.При использовании пользовательской (не AOSP) реализации MTP убедитесь, что реализация опирается исключительно на общедоступные и системные API, чтобы обеспечить взаимодействие реализации с MediaStore.
Настройка
Теперь вы можете добавлять новые форматы мультимедиа, влиять на то, какие устройства хранения данных индексируются, и заменять стек MTP.
Пользовательские форматы медиа. Для каждого нового пользовательского формата медиа необходимо предоставить сопоставление уникального расширения файла с типом MIME. Мы настоятельно рекомендуем вам следовать процессу регистрации IANA .
Вы не можете переопределить расширение или тип MIME, который уже определен в AOSP.
Для файлов
video/*
иaudio/*
MediaProvider продолжает консультироваться сMediaMetadataRetriever
. Используйте Android 10 Media Extractors для возврата метаданных для пользовательских форматов.Для файлов
image/*
MediaProvider продолжает стандартизироватьExif
для метаданных. Вы можете расширитьandroid.media.ExifInterface
для извлечения и возврата метаданныхExif
для любых пользовательских форматов изображений.
Флаг индексации устройств хранения. MediaProvider индексирует все тома, возвращаемые
StorageManager.getStorageVolumes()
, гдеStorageVolume.getMediaStoreVolumeName()
не равен нулю. Вы можете настроить список возвращаемых томов, чтобы повлиять на то, что индексируется, но мы не рекомендуем включать временные тома (например, USB OTG-накопители).Замена стека MTP. Android 11 полностью помещает стек MTP за пределы модуля и обеспечивает его работу с публичными API.
Тестирование
Проверить работоспособность MediaProvider можно с помощью следующих тестов:
Для проверки функциональности общедоступных API MediaStore используйте тесты в пакете
CtsProviderTestCases
набора тестов совместимости Android (CTS).Для проверки функциональности внутренних компонентов MediaProvider используйте тесты в
MediaProviderTests
.
Чтобы запустить оба набора тестов одновременно, используйте следующую команду atest
:
atest --test-mapping packages/providers/MediaProvider