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