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

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

    • Для файлов 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 и более поздних версиях производители оригинального оборудования (OEM) могут предоставлять список исключений без учета регистра для папок, которые 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 (CTS).

  • Для проверки работоспособности внутренних механизмов MediaProvider используйте тесты из MediaProviderTests .

Для одновременного запуска обоих наборов тестов используйте следующую atest :

atest --test-mapping packages/providers/MediaProvider