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 auchimage/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/*
- undaudio/*
-Dateien zurückgeben (überMediaMetadataRetriever
) undimage/*
-Dateien (überExifInterface
).
Ä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()
undcreateWriteRequest()
.Neue Spalten
GENERATION_ADDED
undGENERATION_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, umDateTimeOriginal
-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/*
undaudio/*
berät MediaProvider weiterMediaMetadataRetriever
Verwende für die Rückgabe die Android 10 Media Extractors Metadaten für benutzerdefinierte Formate.Bei Dateien vom Typ
image/*
standardisiert MediaProvider weiterhin aufExif
für Metadaten. Du kannstandroid.media.ExifInterface
erweitern, um Inhalte zu extrahieren und zurückzugebenExif
-Metadaten für alle benutzerdefinierten Bildformate.
Indexierungs-Flag für Speichergeräte. MediaProvider indexiert alle zurückgegebenen Volumes von
StorageManager.getStorageVolumes()
, wobeiStorageVolume.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