Модуль MediaProvider

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

  • Улучшена запись метаданных DateTimeOriginal в SystemUI при записи экрана.

Кроме того, теперь вы можете настраивать 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.

  • При использовании собственной реализации MTP (не AOSP) убедитесь, что она опирается исключительно на общедоступные и системные 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 создает папки по умолчанию Music/, Podcasts/, Ringtones/, Alarms/, Notifications/, Pictures/, Movies/, Download/, DCIM/, Documents/, Audiobooks/ и Recordings/ (каталог Recordings/ недоступен в Android 11 и более ранних версиях) для новых подключенных томов хранилища. В Android 12 и более поздних версиях производители оригинального оборудования могут предоставить список папок, которые MediaProvider должен пропускать при создании контента по умолчанию. В этом списке не учитывается регистр. Эти папки, например Download/, могут быть созданы по внешней логике.

Чтобы добавить список исключений, используйте config_foldersToSkipInDefaultCreation оверлей ресурсов времени выполнения (RRO). Ниже приведен пример того, как исключить папки по умолчанию Notifications/ и Ringtones/:

<string-array name="config_foldersToSkipInDefaultCreation" translatable="false">
    <item>"Notifications"</item>
    <item>"Ringtones"</item>
</string-array>

Тестирование

Проверить работу MediaProvider можно с помощью следующих тестов:

  • Чтобы проверить работу общедоступных API MediaStore, используйте тесты в пакете CtsProviderTestCases Android Compatibility Test Suite (CTS).

  • Чтобы проверить внутренние функции MediaProvider, используйте тесты в каталоге MediaProviderTests.

Чтобы запустить оба набора тестов, используйте следующую команду atest:

atest --test-mapping packages/providers/MediaProvider