MediaProvider-Modul

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 auch image/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/* und audio/* Dateien (über MediaMetadataRetriever ) und image/* Dateien (über ExifInterface ).

Ä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 Argument QUERY_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() und createWriteRequest() .

    • Neue Spalten GENERATION_ADDED und GENERATION_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 Schreiben DateTimeOriginal 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 Flag VolumeInfo.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/* und audio/* Dateien konsultiert MediaProvider weiterhin MediaMetadataRetriever . Verwenden Sie die Android 10 Media Extractors, um Metadaten für benutzerdefinierte Formate zurückzugeben.

    • Für image/* Dateien standardisiert MediaProvider weiterhin Exif für Metadaten. Sie können android.media.ExifInterface erweitern, um Exif 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, wobei StorageVolume.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