Модуль 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
позволяют приложениям в стиле галереи быстро фильтровать мультимедиа на основе этого столбца.Индексирование метаданных цветового пространства.
Новый столбец
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, вы должны убедиться, что ваша реализация соответствует зависимости, связанной с вашей настройкой).
При использовании настраиваемых или нестандартных форматов файлов мультимедиа (например, формат, созданный приложением камеры конкретного поставщика), вы должны зарегистрировать каждый пользовательский формат с помощью
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