MediaProvider-Modul

Das MediaProvider Modul optimiert indexierten Metadaten (Audio, Video und Bilder von SD - Karten und USB - Geräten) und macht , dass die verfügbaren Daten zu Anwendungen durch die Mediastor öffentlichen APIs . Um die Privatsphäre der Nutzer, die MediaProvider Modul erzwingt die Aufrechterhaltung scoped Speichersicherheitsmodell eingeführt in Android 10, die empfindliche Stelle umfasst redacting Metadaten. Dieses Modul ist aktualisierbar, sodass Android schneller auf Sicherheitsprobleme reagieren kann (sensible Benutzerdaten geschützt bleiben) und neue Medienformate schneller hinzufügen kann (was sowohl Benutzern als auch Entwicklern Konsistenz bietet).

Änderungen in Android 10

Android 10 hat mehrere Verbesserungen in Bezug auf das Identifizieren und Extrahieren von Daten aus Mediendateien eingeführt, insbesondere:

  • Bestimmen des Dateiinhaltstyps anhand des ersten Teils des MIME-Typs einer Datei. Zum Beispiel weiß das Betriebssystem , dass sowohl image/png und image/x-newly-invented-format Bilder sind, und kann somit genau relevante Berechtigungen für die Endbenutzer beschreiben.

  • Die Ermittlung des MIME - Typs nur die Dateierweiterung mit (und ohne die Verwendung von Content - Sniffing Sicherheitsprobleme zu vermeiden).

  • Die Ermittlung des MIME - Typs einer beliebigen Datei , die eine Kombination der Verwendung von Upstream Debian Linux und Android - Mappings .

  • Wiederkehr relevante 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 den öffentlichen MediaStore-APIs abgleicht. Zu den Änderungen gehören:

    • Neue is_favorite Spalte und QUERY_ARG_MATCH_FAVORITE Argument Galerie-style - Anwendungen schnell Filtermedien auf dieser Spalte basieren zu ermöglichen.

    • Indizierung von Farbraum-Metadaten.

    • Neu ‚is_trashed‘ Spalte und QUERY_ARG_MATCH_TRASHED Argument Galerie-Stil apps Filter basierend auf dieser Spalte zu ermöglichen.

    • Neue APIs , die Bulk-Modifikation mehrerer Elemente mit einem einzigen Benutzerdialog Aufforderung einschließlich aktivieren createDeleteRequest() , createFavoriteRequest() , createTrashRequest() und createWriteRequest() .

    • New GENERATION_ADDED und GENERATION_MODIFIED Spalten für den Einsatz in schnell und zuverlässig Änderungen erkennen, die seit einem vorhergehenden Synchronisationspunkt aufgetreten sind.

    • Neues GROUP BY öffentliche API für die Verwendung mit zusätzlichen Metadatenspalten nicht genannt wurden.

  • Verbesserung ExifInterface zu extrahieren Metadaten aus PNG und WebP Containern.

  • Verbesserungen SystemUI zu 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. Weitere Einzelheiten finden Sie Customization .

Modulgrenze

Android 11 wandert die gesamten Code in packages/providers/MediaProvider an eine neue Position, mit der bemerkenswerten Ausnahme von MTP-bezogene Logik. Darüber hinaus frameworks/base/core/java/android/provider/MediaStore.java ist jetzt innerhalb des Moduls Grenze bei packages/providers/MediaProvider .

Paketformat

Das MediaProvider-Modul liegt im APK-in-APEX-Format vor.

Abhängigkeiten

MediaProvider Abhängigkeiten sind im Zusammenhang Anpassungen (dh, wenn Sie MediaProvider anpassen, müssen Sie sicherstellen , Ihre Implementierung erfüllt die Abhängigkeit mit Anpassung verbunden sind ).

  • Wenn Sie benutzerdefinierte oder Nicht - Standard - Mediendateiformate (beispielsweise ein Format , das von einem herstellerspezifische Kamera - App generiert) verwenden, müssen Sie jedes benutzerdefiniertes Format mit registrieren MimeUtils und Medien Extractor - Modul Indizierung durch MediaProvider zu ermöglichen.

  • Um MediaProvider Indizes einen benutzerdefinierten Satz von Speichergeräten (wie SD - Karten - Slots und USB - Ports) , die in einer zu gewährleisten StorageManagerService Implementierung, stellen Sie die VolumeInfo.MOUNT_FLAG_INDEXABLE Flagge.

  • Wenn Sie eine benutzerdefinierte (Nicht-AOSP) MTP-Implementierung verwenden, stellen Sie sicher, dass die Implementierung ausschließlich auf öffentlichen APIs und System-APIs basiert, damit die Implementierung mit MediaStore interagieren kann.

Anpassung

Sie können jetzt 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 , die folgen IANA Registrierungsprozess .

    • Sie können eine Erweiterung oder einen MIME-Typ, der bereits in AOSP definiert ist, nicht neu definieren.

    • Für video/* und audio/* Dateien, weiterhin Beratung MediaProvider MediaMetadataRetriever . Verwenden Sie die Android 10 Media Extractors, um Metadaten für benutzerdefinierte Formate zurückzugeben.

    • Für image/* Dateien, weiter MediaProvider auf die Standardisierung Exif für Metadaten. Sie können erweitern android.media.ExifInterface zu extrahieren und das Rück Exif - Metadaten für alle benutzerdefinierten Bildformate.

  • Indizierungsflag für Speichergeräte. MediaProvider indiziert alle von zurück Volumen StorageManager.getStorageVolumes() , wo StorageVolume.getMediaStoreVolumeName() nicht null ist . Sie können die Liste der zurückgegebenen Volumes anpassen, um zu beeinflussen, was indiziert wird, aber wir raten davon ab, vorübergehende Volumes (wie USB-OTG-Laufwerke) einzuschließen.

  • MTP-Stack-Ersatz. Android 11 platziert den MTP-Stack vollständig außerhalb der Modulgrenze und stellt sicher, dass er gegen öffentliche APIs funktioniert.

Testen

Sie können die Funktionalität von MediaProvider anhand der folgenden Tests überprüfen:

  • Um zu überprüfen , um die Funktionalität von Mediastor öffentliche APIs, Anwendungstests im CtsProviderTestCases Paket der Android Compatibility Test Suite (CTS).

  • Um die Funktionalität von MediaProvider Interna, verwenden Tests zu überprüfen MediaProviderTests .

Um beiden Arten von Tests zusammenlaufen, verwenden Sie den folgenden atest Befehl ein :

atest --test-mapping packages/providers/MediaProvider