Модуль Медиапровайдера

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