Das MediaProvider-Modul optimiert indizierte Metadaten (Audio, Video und Bilder von SD-Karten und USB-Geräten) und stellt diese Daten Apps über die öffentlichen MediaStore-APIs zur Verfügung. Um die Privatsphäre der Benutzer zu wahren, erzwingt das MediaProvider-Modul das in Android 10 eingeführte bereichsbezogene Speichersicherheitsmodell , das die Schwärzung vertraulicher Standortmetadaten umfasst. Dieses Modul ist aktualisierbar und ermöglicht es Android, schneller auf Sicherheitsprobleme zu reagieren (den Schutz sensibler Benutzerdaten zu wahren) und neue Medienformate schneller hinzuzufügen (so dass sowohl Benutzern als auch Entwicklern Konsistenz geboten wird).
Änderungen in Android 10
Android 10 führte mehrere Verbesserungen im Zusammenhang mit der Identifizierung und Extraktion von Daten aus Mediendateien ein, insbesondere:
Bestimmen des Dateiinhaltstyps anhand des ersten Teils des MIME-Typs einer Datei. Beispielsweise weiß das Betriebssystem, dass es sich sowohl
image/png
als auchimage/x-newly-invented-format
um Bilder handelt, und kann daher relevante Berechtigungen für den Endbenutzer genau beschreiben.Bestimmen des MIME-Typs nur anhand der Dateierweiterung (und ohne Content-Sniffing , um Sicherheitsprobleme zu vermeiden).
Bestimmen des MIME-Typs einer beliebigen Datei mithilfe einer Kombination aus Upstream-Debian-Linux- und Android-Zuordnungen .
Rückgabe relevanter Daten aus
video/*
undaudio/*
Dateien (überMediaMetadataRetriever
) undimage/*
Dateien (überExifInterface
).
Änderungen in Android 11
In Android 11 baut das MediaProvider-Modul auf den in Android 10 vorgenommenen Änderungen mit den folgenden Verbesserungen auf:
Verbesserungen bei der Indizierung. Das MediaProvider-Modul indiziert jetzt Metadaten, indem es verfügbare Metadaten mit öffentlichen MediaStore-APIs abgleicht. Zu den Änderungen gehören:
Die neue Spalte
is_favorite
und das ArgumentQUERY_ARG_MATCH_FAVORITE
“ ermöglichen es Apps im Galeriestil, Medien basierend auf dieser Spalte schnell zu filtern.Indizieren von Farbraummetadaten.
Neue „is_trashed“-Spalte und
QUERY_ARG_MATCH_TRASHED
Argument, um Apps im Galeriestil zu ermöglichen, basierend auf dieser Spalte zu filtern.Neue APIs, die die Massenänderung mehrerer Elemente mit einer einzigen Benutzerdialogaufforderung 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 erwähnt wurden.
Verbesserung an
ExifInterface
zum Extrahieren von Metadaten aus PNG- und WebP-Containern.Verbesserungen an
SystemUI
zum SchreibenDateTimeOriginal
Metadaten in Screenshots.
Darüber hinaus können Sie MediaProvider jetzt anpassen, indem Sie neue Medienformate hinzufügen, markieren, welche Speichergeräte indiziert werden sollen, und sogar den MTP-Stack ersetzen. Einzelheiten finden Sie unter Anpassung .
Modulgrenze
Android 11 migriert den gesamten Code in packages/providers/MediaProvider
an einen neuen Speicherort, mit Ausnahme der MTP-bezogenen Logik. Darüber hinaus befindet sich frameworks/base/core/java/android/provider/MediaStore.java
jetzt innerhalb der Modulgrenze unter packages/providers/MediaProvider
.
Paketformat
Das MediaProvider-Modul liegt im APK-in-APEX-Format vor.
Abhängigkeiten
MediaProvider-Abhängigkeiten hängen mit Anpassungen zusammen (d. h. wenn Sie MediaProvider anpassen, müssen Sie sicherstellen, dass Ihre Implementierung die mit Ihrer Anpassung verbundenen Abhängigkeiten erfüllt).
Wenn Sie benutzerdefinierte oder nicht standardmäßige Mediendateiformate verwenden (z. B. ein von einer herstellerspezifischen Kamera-App generiertes Format), müssen Sie jedes benutzerdefinierte Format bei
MimeUtils
und dem Media Extractor-Modul registrieren, um die Indizierung durch MediaProvider zu ermöglichen.Um sicherzustellen, dass MediaProvider einen benutzerdefinierten Satz von Speichergeräten (z. B. SD-Kartensteckplätze und USB-Anschlüsse) indiziert, die in einer
StorageManagerService
Implementierung verwendet werden, legen Sie das FlagVolumeInfo.MOUNT_FLAG_INDEXABLE
“ fest.Wenn Sie eine benutzerdefinierte MTP-Implementierung (nicht AOSP) verwenden, stellen Sie sicher, dass die Implementierung ausschließlich auf öffentlichen APIs und System-APIs basiert, um die Interaktion der Implementierung mit MediaStore zu ermöglichen.
Anpassung
Sie können nun neue Medienformate hinzufügen, beeinflussen, welche Speichergeräte indiziert werden, und den MTP-Stack ersetzen.
Benutzerdefinierte Medienformate. Für jedes neue benutzerdefinierte Medienformat müssen Sie eine Zuordnung von der eindeutigen Dateierweiterung zu einem MIME-Typ bereitstellen. Wir empfehlen Ihnen dringend, dem IANA-Registrierungsprozess zu folgen.
Sie können eine Erweiterung oder einen MIME-Typ, der bereits in AOSP definiert ist, nicht neu definieren.
Für
video/*
undaudio/*
Dateien konsultiert MediaProvider weiterhinMediaMetadataRetriever
. Verwenden Sie die Android 10 Media Extractors, um Metadaten für benutzerdefinierte Formate zurückzugeben.Für
image/*
Dateien standardisiert MediaProvider weiterhinExif
für Metadaten. Sie könnenandroid.media.ExifInterface
erweitern, umExif
Metadaten für beliebige benutzerdefinierte Bildformate zu extrahieren und zurückzugeben.
Indexierungsflag für Speichergeräte. MediaProvider indiziert alle von
StorageManager.getStorageVolumes()
zurückgegebenen Volumes, wobeiStorageVolume.getMediaStoreVolumeName()
ungleich Null ist. Sie können die Liste der zurückgegebenen Volumes anpassen, um zu beeinflussen, was indiziert wird. Wir raten jedoch davon ab, vorübergehende Volumes (z. B. USB-OTG-Laufwerke) einzubeziehen.Austausch des MTP-Stacks. Android 11 platziert den MTP-Stack vollständig außerhalb der Modulgrenzen und stellt sicher, dass er mit öffentlichen APIs funktioniert.
Testen
Mit den folgenden Tests können Sie die Funktionalität von MediaProvider überprüfen:
Um die Funktionalität der öffentlichen MediaStore-APIs zu überprüfen, verwenden Sie Tests im
CtsProviderTestCases
Paket der Android Compatibility Test Suite (CTS).Um die Funktionalität der MediaProvider-Interna zu überprüfen, verwenden Sie Tests in
MediaProviderTests
.
Um beide Testsätze zusammen auszuführen, verwenden Sie den folgenden atest
Befehl:
atest --test-mapping packages/providers/MediaProvider