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

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