MediaProvider-Modul

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. 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 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 in Android 10

Mit Android 10 wurden mehrere Verbesserungen in Bezug auf die Identifizierung und Extraktion von Daten aus Mediendateien eingeführt, insbesondere:

  • Der Dateiinhaltstyp wird anhand des ersten Teils des MIME-Typs einer Datei ermittelt. Beispielsweise weiß das Betriebssystem, dass sowohl image/png als auch image/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)

  • 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 (über MediaMetadataRetriever) und image/*-Dateien (über ExifInterface) zurückgeben

Änderungen bei 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. Das Modul "MediaProvider" indexiert jetzt Metadaten, indem verfügbare Metadaten mit den öffentlichen MediaStore APIs abgeglichen werden. Zu den Änderungen gehören:

    • Neue Spalte is_favorite und QUERY_ARG_MATCH_FAVORITE-Argument, mit denen Medien im Galeriestil 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, die Bulk-Änderungen an mehreren Elementen über die Eingabeaufforderung eines einzelnen Nutzers ermöglichen, einschließlich createDeleteRequest(), createFavoriteRequest(), createTrashRequest() und createWriteRequest().

    • Neue Spalten GENERATION_ADDED und GENERATION_MODIFIED, mit denen sich Änderungen seit einem vorherigen Synchronisierungszeitpunkt schnell und zuverlässig erkennen lassen.

    • 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 bei SystemUI, um DateTimeOriginal-Metadaten in Screenshots 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 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 deiner Anpassung verknüpfte 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 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, 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 dir dringend, den IANA-Registrierungsprozess zu befolgen.

    • Sie können keine Erweiterung oder MIME-Art neu definieren, die bereits in AOSP definiert ist.

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

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

  • 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 zum Prüfen der Funktionalität der öffentlichen APIs von MediaStore die Tests im Paket CtsProviderTestCases der Android Compatibility Test Suite (CTS).

  • 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