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

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