Модуль 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