Das Modul MediaProvider optimiert indexierte Metadaten (Audio, Video und Bilder von SD-Karten und USB-Geräten) und stellt diese Daten über die öffentlichen MediaStore APIs für Anwendungen zur Verfügung. Um die Privatsphäre der Nutzer zu schützen, erzwingt das MediaProvider-Modul das in Android 10 eingeführte Sicherheitsmodell für begrenzten Speicher. Dabei werden vertrauliche Standortmetadaten entfernt. Dieses Modul ist aktualisierbar, damit Android schneller auf Sicherheitsprobleme reagieren kann (zum Schutz sensibler Nutzerdaten) und neue Medienformate schneller hinzufügen kann (für Konsistenz sowohl für Nutzer als auch für Entwickler).
Änderungen bei Android 10
Mit Android 10 wurden mehrere Verbesserungen in Bezug auf die Identifizierung und Extraktion von Daten aus Mediendateien eingeführt, insbesondere:
Bestimmen des Inhaltstyps anhand des ersten Teils des MIME-Typs einer Datei Beispielsweise weiß das Betriebssystem, dass sowohl
image/png
als auchimage/x-newly-invented-format
Images sind, und kann somit dem Endnutzer relevante Berechtigungen genau beschreiben.Ermitteln des MIME-Typs ausschließlich anhand der Dateiendung (und ohne Inhaltssniffing zur Vermeidung von Sicherheitsproblemen)
Ermitteln des MIME-Typs einer beliebigen Datei mithilfe einer Kombination aus vorgelagerten Debian Linux- und Android-Zuordnungen.
Relevante Daten aus
video/*
- undaudio/*
-Dateien (überMediaMetadataRetriever
) undimage/*
-Dateien (überExifInterface
) zurückgeben.
Änderungen bei Android 11
In Android 11 baut das MediaProvider-Modul auf den in Android 10 vorgenommenen Änderungen mit den folgenden Verbesserungen auf:
Verbesserungen bei der Indexierung. Das MediaProvider-Modul indexiert jetzt Metadaten, indem verfügbare Metadaten mit den öffentlichen MediaStore APIs abgeglichen werden. Zu den Änderungen gehören:
Neue Spalte
is_favorite
undQUERY_ARG_MATCH_FAVORITE
-Argument, mit denen Medien im Galeriestil schnell anhand dieser Spalte gefiltert werden können.Farbraummetadaten werden indexiert.
Neue Spalte „is_trashed“ und
QUERY_ARG_MATCH_TRASHED
-Argument, damit Apps im Galeriestil anhand dieser Spalte filtern könnenNeue APIs, die Bulk-Änderungen an mehreren Elementen über die Eingabeaufforderung eines einzelnen Nutzers ermöglichen, einschließlich
createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
undcreateWriteRequest()
.Neue Spalten
GENERATION_ADDED
undGENERATION_MODIFIED
zur schnellen und zuverlässigen Erkennung von Änderungen, die seit einem vorherigen Synchronisierungspunkt aufgetreten sind.Neue öffentliche
GROUP BY
API zur Verwendung mit zusätzlichen Metadatenspalten, die oben nicht aufgeführt sind.
Verbesserung an
ExifInterface
zum Extrahieren von Metadaten aus PNG- und WebP-Containern.Verbesserungen an
SystemUI
, umDateTimeOriginal
-Metadaten in Bildschirmaufnahmen zu schreiben.
Darüber hinaus können Sie MediaProvider jetzt anpassen, indem Sie neue Medienformate hinzufügen, markieren, welche Speichergeräte indexiert werden sollen, und sogar den MTP-Stapel ersetzen. Weitere Informationen
Modulgrenze
Android 11 migriert den gesamten Code in packages/providers/MediaProvider
an einen neuen Speicherort, mit 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 liegt im APK-in-APEX-Format vor.
Abhängigkeiten
MediaProvider-Abhängigkeiten beziehen sich auf Anpassungen. Wenn Sie also MediaProvider anpassen, müssen Sie darauf achten, dass Ihre Implementierung die mit Ihrer Anpassung verbundene Abhängigkeit erfüllt.
Wenn du benutzerdefinierte oder nicht standardmäßige Mediendateiformate verwendest (z. B. ein Format, das von einer anbieterspezifischen Kamera-App generiert wurde), musst du jedes benutzerdefinierte Format bei
MimeUtils
und dem Media Extractor-Modul registrieren, um die Indexierung durch MediaProvider zu aktivieren.Damit 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 MTP-Implementierung (nicht AOSP) verwenden, achten Sie darauf, dass die Implementierung ausschließlich auf öffentlichen APIs und System-APIs basiert, damit die Implementierung mit MediaStore interagieren kann.
Personalisierung
Sie können jetzt neue Medienformate hinzufügen, beeinflussen, 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 bereitstellen. Wir empfehlen dir dringend, den IANA-Registrierungsprozess zu befolgen.
Erweiterungen oder MIME-Typen, die bereits in AOSP definiert wurden, können nicht neu definiert werden.
Bei Dateien vom Typ
video/*
undaudio/*
berät MediaProvider weiterhinMediaMetadataRetriever
. Verwende die Android 10 Media Extractors, um Metadaten für benutzerdefinierte Formate zurückzugeben.Bei
image/*
-Dateien standardisiert MediaProvider weiterhinExif
für Metadaten. Sie könnenandroid.media.ExifInterface
erweitern, umExif
-Metadaten für alle benutzerdefinierten Bildformate zu extrahieren und zurückzugeben.
Indexierungs-Flag für Speichergeräte. MediaProvider indexiert alle von
StorageManager.getStorageVolumes()
zurückgegebenen Volumes, wobeiStorageVolume.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, vorübergehende Volumes wie USB-OTG-Laufwerke einzubeziehen.Ersetzen des MTP-Stacks. Android 11 platziert den MTP-Stack vollständig außerhalb der Modulgrenze und stellt sicher, dass er mit öffentlichen APIs funktioniert.
Testen
Sie können die Funktionalität von MediaProvider mit den folgenden Tests überprüfen:
Verwenden Sie Tests im Paket
CtsProviderTestCases
der Android Compatibility Test Suite (CTS), um die Funktionalität der öffentlichen MediaStore APIs zu prüfen.Verwende Tests in
MediaProviderTests
, um die Funktionalität von MediaProvider-internen Komponenten zu prüfen.
Verwenden Sie den folgenden atest
-Befehl, um beide Testsätze gleichzeitig auszuführen:
atest --test-mapping packages/providers/MediaProvider