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