MediaProvider-Modul

Das Modul „MediaProvider“ optimiert indexierte Metadaten (Audio, Video und Bilder). von SD-Karten und USB-Geräten) und stellt diese Daten für Apps über das MediaStore öffentlich APIs Um die Privatsphäre der Nutzer zu wahren, erzwingt das MediaProvider-Modul den eingeschränkten Speicher Sicherheit Modell die mit Android 10 eingeführt wurde. Dabei wurden vertrauliche Standortmetadaten entfernt. Dieses Modul kann aktualisiert werden, damit Android schneller auf Sicherheitsprobleme reagieren kann (zum Schutz sensibler Nutzerdaten) und schneller neue Medienformate hinzufügen So sorgen Sie für Konsistenz sowohl für Nutzer als auch für Entwickler.

Änderungen bei Android 10

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

  • Bestimmen des Inhaltstyps anhand des ersten Teils des MIME-Typs einer Datei 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.

  • Ermitteln des MIME-Typs nur anhand der Dateiendung (und ohne Sniffing von Inhalten um Sicherheitsprobleme zu vermeiden).

  • Bestimmung des MIME-Typs einer beliebigen Datei mithilfe einer Kombination aus vorgelagerten Debian Linux und Android Zuordnungen.

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

Änderungen bei 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.

    • Farbraummetadaten werden indexiert.

    • Neues Attribut „is_trashed“ Spalte und Argument QUERY_ARG_MATCH_TRASHED zum Aktivieren Apps im Galeriestil, um basierend auf dieser Spalte zu filtern.

    • 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 zur schnellen Verwendung und zuverlässig Änderungen zu erkennen, die seit einer vorherigen Synchronisierungspunkt.

    • Neue öffentliche GROUP BY API zur Verwendung mit zusätzlichen Metadatenspalten, nicht wie oben erwähnt.

  • Verbesserung an ExifInterface zum Extrahieren von Metadaten aus PNG und WebP Container.

  • SystemUI wurde verbessert, um DateTimeOriginal-Metadaten auf dem Bildschirm zu schreiben Aufnahmen.

Darüber hinaus können Sie MediaProvider jetzt anpassen, indem Sie neue Medienformate, angeben, welche Speichergeräte indexiert werden sollen, und sogar das MTP ersetzen Stacks. Weitere Informationen

Modulgrenze

Bei Android 11 wird der gesamte Code packages/providers/MediaProvider an einen neuen Ort verschoben, mit Ausnahme der MTP-bezogenen Logik. Außerdem frameworks/base/core/java/android/provider/MediaStore.java befindet sich jetzt innerhalb von 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 (die Wenn Sie MediaProvider anpassen, müssen Sie sicherstellen, dass Ihre Implementierung den der mit Ihrer Anpassung verbundenen Abhängigkeit).

  • Wenn Sie benutzerdefinierte oder nicht standardmäßige Mediendateiformate (z. B. ein Format Kamera-App generiert wird), müssen Sie jeden benutzerdefinierten mit MimeUtils und dem Media Extractor-Modul, um die Indexierung durch MediaProvider enthalten.

  • Um sicherzustellen, dass MediaProvider einen benutzerdefinierten Satz von Speichergeräten wie SD-Karten indexiert Steckplätze und USB-Ports), die in einer StorageManagerService-Implementierung verwendet werden, VolumeInfo.MOUNT_FLAG_INDEXABLE-Flag.

  • Wenn Sie eine benutzerdefinierte MTP-Implementierung (nicht AOSP) verwenden, achten Sie darauf, ausschließlich öffentliche APIs und System-APIs nutzen, um die Implementierung mit MediaStore interagieren.

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. 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 für die Rückgabe die Android 10 Media Extractors Metadaten für benutzerdefinierte Formate.

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

  • Indexierungs-Flag für Speichergeräte. MediaProvider indexiert alle zurückgegebenen Volumes von StorageManager.getStorageVolumes(), wobei StorageVolume.getMediaStoreVolumeName() ist nicht null. 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. Android 11 platziert die MTP Stacks vollständig außerhalb der Modulgrenze liegen, und stellt sicher, dass es öffentlichen APIs.

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).

  • Überprüfen Sie die Funktionalität von MediaProvider-internen Elementen mithilfe von Tests in MediaProviderTests

Verwenden Sie den folgenden atest-Befehl, um beide Testsätze gemeinsam auszuführen:

atest --test-mapping packages/providers/MediaProvider