MediaProvider-Modul

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 Begrenzung, 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 bei Android 10

Mit Android 10 wurden mehrere Verbesserungen im Hinblick auf die Identifizierung und Extraktion eingeführt. Daten aus Mediendateien, insbesondere:

  • Der Dateiinhaltstyp wird anhand des ersten Teils des MIME-Typs einer Datei ermittelt. Zum Beispiel weiß das Betriebssystem, dass sowohl image/png als auch image/x-newly-invented-format sind Bilder und können daher genau beschreiben relevanten Berechtigungen an den Endnutzer.

  • 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 aus Upstream-Debian-Linux- und Android-Zuordnungen ermittelt.

  • Relevante Daten aus video/*- und audio/*-Dateien zurückgeben (über MediaMetadataRetriever) und image/*-Dateien (über ExifInterface).

Änderungen in Android 11

In Android 11 baut das MediaProvider-Modul auf in Android 10 vorgenommene Änderungen mit den folgenden Verbesserungen:

  • Verbesserungen bei der Indexierung. Das Modul "MediaProvider" indexiert Metadaten jetzt nach Abgleich der verfügbaren Metadaten mit den öffentlichen MediaStore APIs Änderungen umfassen:

    • Neue Spalte „is_favorite“ und Argument „QUERY_ARG_MATCH_FAVORITE“ zum Aktivieren Apps im Galeriestil verwenden, um Medien schnell anhand dieser Spalte zu filtern.

    • 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, die die Bulk-Änderung mehrerer Elemente durch einen einzelnen Nutzer ermöglichen Aufforderung im Dialogfeld, einschließlich createDeleteRequest(), createFavoriteRequest(), createTrashRequest() und createWriteRequest().

    • Neue Spalten GENERATION_ADDED und GENERATION_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, um DateTimeOriginal-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 liegt im APK-in-APEX-Format vor.

Abhängigkeiten

MediaProvider-Abhängigkeiten beziehen sich auf Anpassungen. Wenn du MediaProvider anpasst, musst du dafür sorgen, dass deine Implementierung die mit deiner 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 Flag VolumeInfo.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 und 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 angeben. Wir empfehlen dringend, müssen Sie die IANA-Registrierung durchlaufen

    • Erweiterungen oder MIME-Typen, die bereits in AOSP definiert wurden, können nicht neu definiert werden.

    • Bei Dateien vom Typ video/* und audio/* berät MediaProvider weiter MediaMetadataRetriever Verwende die Media-Extractors von Android 10, um Metadaten für benutzerdefinierte Formate zurückzugeben.

    • Bei image/*-Dateien wird bei MediaProvider weiterhin Exif für Metadaten standardisiert. Du kannst android.media.ExifInterface erweitern, um Inhalte zu extrahieren und zurückzugeben Exif-Metadaten für alle benutzerdefinierten Bildformate.

  • Flag für die Indexierung von Speichergeräten MediaProvider indexiert alle Volumes, die von StorageManager.getStorageVolumes() zurückgegeben werden, wobei StorageVolume.getMediaStoreVolumeName() nicht null ist. Sie können die Liste der zurückgegebenen Bücher, um zu beeinflussen, was indexiert wird. Wir raten jedoch davon ab, einschließlich temporärer Volumes (z. B. USB-OTG-Laufwerke).

  • Ersetzen 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 Funktionalität von MediaProvider mit den folgenden Tests überprüfen:

  • Überprüfen Sie die Funktionalität der öffentlichen MediaStore APIs mithilfe von Tests in der CtsProviderTestCases-Paket der Android Compatibility Test Suite (CTS).

  • Um die Funktionalität der MediaProvider-Interna zu überprüfen, kannst du Tests in MediaProviderTests verwenden.

Wenn Sie beide Testgruppen gleichzeitig ausführen möchten, verwenden Sie den folgenden atest-Befehl:

atest --test-mapping packages/providers/MediaProvider