Модуль 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 для возврата метаданных для пользовательских форматов.Для файлов
image/*
MediaProvider продолжает стандартизироватьExif
для метаданных. Вы можете расширить интерфейсandroid.media.ExifInterface
для извлечения и возврата метаданныхExif
для любых пользовательских форматов изображений.
Флаг индексации устройств хранения данных. MediaProvider индексирует все тома, возвращаемые методом
StorageManager.getStorageVolumes()
, гдеStorageVolume.getMediaStoreVolumeName()
не равно NULL. Вы можете настроить список возвращаемых томов, чтобы повлиять на индексируемые данные, но мы не рекомендуем включать в него временные тома (например, USB-накопители OTG).Замена стека MTP. Android 11 полностью выносит стек MTP за пределы модуля и обеспечивает его работу с публичными API.
Тестирование
Проверить работоспособность MediaProvider можно с помощью следующих тестов:
Для проверки функциональности публичных API MediaStore используйте тесты из пакета
CtsProviderTestCases
набора тестов совместимости Android (CTS).Для проверки функциональности внутренних компонентов MediaProvider используйте тесты в
MediaProviderTests
.
Чтобы запустить оба набора тестов одновременно, используйте следующую команду atest
:
atest --test-mapping packages/providers/MediaProvider