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

Модуль 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 Media Extractors для возврата метаданных для пользовательских форматов.

    • Для файлов 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