Das MediaProvider-Modul optimiert indexierte Metadaten (Audio, Video und Bilder von SD-Karten und USB-Speichergeräten) und stellt diese Daten über die öffentlichen APIs von MediaStore für Apps zur Verfügung. Zum Schutz der Privatsphäre der Nutzer erzwingt das MediaProvider-Modul das Sicherheitsmodell für Speicher mit begrenztem Zugriff, das in Android 10 eingeführt wurde. Dazu gehört auch das Entfernen sensibler Standortmetadaten. Dieses Modul kann aktualisiert werden, sodass Android-Geräte schneller auf Sicherheitsprobleme reagieren (um sensible Nutzerdaten zu schützen) und neue Medienformate schneller hinzugefügt werden können (für Konsistenz bei Nutzern und Entwicklern).
Änderungen in Android 10
Mit Android 10 wurden mehrere Verbesserungen im Zusammenhang mit der Identifizierung und dem Extrahieren von Daten aus Mediendateien eingeführt. Im Einzelnen:
Der Dateiinhaltstyp wird anhand des ersten Teils des MIME-Typs einer Datei ermittelt. Das Betriebssystem weiß beispielsweise, dass sowohl
image/png
als auchimage/x-newly-invented-format
Bilder sind, und kann dem Endnutzer daher die relevanten Berechtigungen genau beschreiben.Der MIME-Typ wird nur anhand der Dateiendung ermittelt (ohne Content-Sniffing, um Sicherheitsprobleme zu vermeiden).
Der MIME-Typ einer beliebigen Datei wird anhand einer Kombination von Upstream-Zuordnungen von Debian Linux und Android ermittelt.
Relevante Daten aus
video/*
- undaudio/*
-Dateien (überMediaMetadataRetriever
) undimage/*
-Dateien (überExifInterface
) zurückgeben
Änderungen in Android 11
In Android 11 baut das MediaProvider-Modul auf den Änderungen in Android 10 auf und bietet die folgenden Verbesserungen:
Verbesserungen bei der Indexierung. Im MediaProvider-Modul werden jetzt Metadaten indexiert, indem verfügbare Metadaten mit öffentlichen MediaStore-APIs abgeglichen werden. Zu den Änderungen gehören:
Neue Spalte
is_favorite
und neues ArgumentQUERY_ARG_MATCH_FAVORITE
, mit denen in Galerie-Apps Medien schnell anhand dieser Spalte gefiltert werden können.Indexierung von Metadaten zum Farbraum
Neue Spalte „is_trashed“ und
QUERY_ARG_MATCH_TRASHED
-Argument, mit denen in Galerie-Apps nach dieser Spalte gefiltert werden kann.Neue APIs, mit denen mehrere Elemente mit einem einzigen Dialogfeld für Nutzer geändert werden können, darunter
createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
undcreateWriteRequest()
.Neue Spalten
GENERATION_ADDED
undGENERATION_MODIFIED
, mit denen sich Änderungen seit einem vorherigen Synchronisierungspunkt schnell und zuverlässig erkennen lassen.Neue
GROUP BY
-Public API zur Verwendung mit zusätzlichen Metadatenspalten, die oben nicht erwähnt wurden.
Verbesserungen bei
ExifInterface
zum Extrahieren von Metadaten aus PNG- und WebP-Containern.Verbesserungen bei
SystemUI
, umDateTimeOriginal
-Metadaten in Screenshots zu schreiben.
Außerdem können Sie MediaProvider jetzt anpassen, indem Sie neue Medienformate hinzufügen, angeben, welche Speichergeräte indexiert werden sollen, und sogar den MTP-Stack ersetzen. Weitere Informationen finden Sie unter Anpassung.
Modulgrenze
In Android 11 wird der gesamte Code in packages/providers/MediaProvider
an einen neuen Speicherort migriert, mit der bemerkenswerten Ausnahme der MTP-bezogenen Logik. Außerdem befindet sich frameworks/base/core/java/android/provider/MediaStore.java
jetzt innerhalb der Modulgrenze bei packages/providers/MediaProvider
.
Paketformat
Das MediaProvider-Modul ist im APK-in-APEX-Format.
Abhängigkeiten
MediaProvider-Abhängigkeiten beziehen sich auf Anpassungen. Wenn du MediaProvider anpasst, musst du dafür sorgen, dass deine Implementierung die mit der Anpassung verknüpfte Abhängigkeit erfüllt.
Wenn Sie benutzerdefinierte oder nicht standardmäßige Mediendateiformate verwenden (z. B. ein Format, das von einer anbieterspezifischen Kamera-App generiert wird), müssen Sie jedes benutzerdefinierte Format bei
MimeUtils
und dem Media Extractor-Modul registrieren, um die Indexierung durch MediaProvider zu aktivieren.Wenn Sie dafür sorgen möchten, dass MediaProvider eine benutzerdefinierte Gruppe von Speichergeräten (z. B. SD-Kartensteckplätze und USB-Ports) indexiert, die in einer
StorageManagerService
-Implementierung verwendet werden, setzen Sie das FlagVolumeInfo.MOUNT_FLAG_INDEXABLE
.Wenn Sie eine benutzerdefinierte (nicht AOSP-kompatible) MTP-Implementierung verwenden, muss diese ausschließlich auf öffentlichen und System-APIs basieren, damit sie mit MediaStore interagieren kann.
Personalisierung
Sie können jetzt neue Medienformate hinzufügen, festlegen, welche Speichergeräte indexiert werden, und den MTP-Stack ersetzen.
Benutzerdefinierte Medienformate Für jedes neue benutzerdefinierte Medienformat müssen Sie eine Zuordnung von der eindeutigen Dateiendung zu einem MIME-Typ angeben. Wir empfehlen Ihnen dringend, den IANA-Registrierungsvorgang zu durchlaufen.
Sie können keine Erweiterung oder MIME-Art neu definieren, die bereits in AOSP definiert ist.
Bei
video/*
- undaudio/*
-Dateien wird weiterhinMediaMetadataRetriever
von MediaProvider abgerufen. Verwende die Media-Extractors von Android 10, um Metadaten für benutzerdefinierte Formate zurückzugeben.Bei
image/*
-Dateien wird bei MediaProvider weiterhinExif
für Metadaten standardisiert. Sie könnenandroid.media.ExifInterface
erweitern, umExif
-Metadaten für beliebige benutzerdefinierte Bildformate zu extrahieren und zurückzugeben.
Flag für die Indexierung von Speichergeräten MediaProvider indexiert alle von
StorageManager.getStorageVolumes()
zurückgegebenen Volumes, bei denenStorageVolume.getMediaStoreVolumeName()
nicht null ist. Sie können die Liste der zurückgegebenen Volumes anpassen, um zu beeinflussen, was indexiert wird. Wir raten jedoch davon ab, temporäre Volumes (z. B. USB-OTG-Speicher) anzugeben.Ersatz des MTP-Stacks Unter Android 11 wird der MTP-Stack vollständig außerhalb der Modulgrenze platziert und dafür gesorgt, dass er mit öffentlichen APIs funktioniert.
Testen
Sie können die Funktion von MediaProvider mit den folgenden Tests prüfen:
Verwenden Sie zum Prüfen der Funktionalität der öffentlichen APIs von MediaStore die Tests im Paket
CtsProviderTestCases
der Android Compatibility Test Suite (CTS).Um die Funktionalität der MediaProvider-Interna zu überprüfen, verwenden Sie Tests in
MediaProviderTests
.
Wenn Sie beide Testgruppen gleichzeitig ausführen möchten, verwenden Sie den folgenden atest
-Befehl:
atest --test-mapping packages/providers/MediaProvider