MediaProvider-Modul

Das MediaProvider-Modul optimiert indexierte Metadaten (Audio, Video und Bilder von SD-Karten und USB-Geräten) und stellt diese Daten Apps über die öffentlichen MediaStore-APIs zur Verfügung. Zum Schutz der Privatsphäre der Nutzer erzwingt das MediaProvider-Modul das in Android 10 eingeführte Sicherheitsmodell für den eingeschränkten Speicher, das das Entfernen sensibler Standortmetadaten umfasst. Dieses Modul kann aktualisiert werden, sodass Android schneller auf Sicherheitsprobleme reagieren kann (um sensible Nutzerdaten zu schützen) und neue Mediaformate schneller hinzugefügt werden können (um Nutzern und Entwicklern Konsistenz zu bieten).

Änderungen in Android 10

In Android 10 wurden mehrere Verbesserungen eingeführt, die sich auf das Identifizieren und Extrahieren von Daten aus Mediendateien beziehen, insbesondere:

  • Den Inhaltstyp der Datei anhand des ersten Teils des MIME-Typs der Datei ermitteln. Das Betriebssystem weiß beispielsweise, dass sowohl image/png als auch image/x-newly-invented-format Bilder sind, und kann dem Endnutzer daher die relevanten Berechtigungen genau beschreiben.

  • Der MIME-Typ wird nur anhand der Dateiendung ermittelt. Content Sniffing wird nicht verwendet, um Sicherheitsprobleme zu vermeiden.

  • Den MIME-Typ einer beliebigen Datei anhand einer Kombination aus Upstream-Debian-Linux- und Android-Zuweisungen ermitteln.

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

Änderungen in 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 MediaProvider-Modul indexiert jetzt Metadaten, indem es verfügbare Metadaten mit öffentlichen MediaStore-APIs abgleicht. Dazu gehören:

    • Neue Spalte is_favorite und neues Argument QUERY_ARG_MATCH_FAVORITE, damit Apps im Galeriestil Medien schnell anhand dieser Spalte filtern können.

    • Indexierung von Farbraum-Metadaten

    • Neue Spalte is_trashed und neues Argument QUERY_ARG_MATCH_TRASHED, damit Apps im Galeriestil anhand dieser Spalte gefiltert werden können.

    • Neue APIs, die die Massenbearbeitung mehrerer Elemente mit einem einzigen Nutzerdialog ermöglichen, darunter createDeleteRequest(), createFavoriteRequest(), createTrashRequest() und createWriteRequest().

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

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

  • ExifInterface wurde verbessert, um Metadaten aus PNG- und WebP-Containern zu extrahieren.

  • Verbesserungen bei SystemUI zum Schreiben von DateTimeOriginal-Metadaten in Screenshots.

Außerdem können Sie MediaProvider jetzt anpassen, indem Sie neue Mediaformate hinzufügen, festlegen, welche Speichergeräte indexiert werden sollen, und sogar den MTP-Stack ersetzen. Weitere Informationen finden Sie unter Anpassung.

Modulgrenze

Unter Android 11 wird der gesamte Code in packages/providers/MediaProvider an einen neuen Speicherort migriert, 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 Sie MediaProvider anpassen, müssen Sie dafür sorgen, dass Ihre Implementierung die mit Ihrer Anpassung verbundene Abhängigkeit erfüllt.

  • Wenn Sie benutzerdefinierte oder nicht standardmäßige Media-Dateiformate 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, damit es vom MediaProvider indexiert werden kann.

  • Damit MediaProvider einen benutzerdefinierten Satz von Speichergeräten (z. B. SD-Kartensteckplätze und USB-Anschlüsse) indexiert, die in einer StorageManagerService-Implementierung verwendet werden, legen Sie das Flag VolumeInfo.MOUNT_FLAG_INDEXABLE fest.

  • Wenn Sie eine benutzerdefinierte (nicht AOSP-)MTP-Implementierung verwenden, muss diese ausschließlich auf öffentlichen und System-APIs basieren, damit sie mit MediaStore interagieren kann.

Personalisierung

Sie können neue Media-Formate hinzufügen, beeinflussen, welche Speichergeräte indexiert werden, den MTP-Stack ersetzen und verhindern, dass Standardordner erstellt werden.

  • Benutzerdefinierte Media-Formate: Für jedes neue benutzerdefinierte Mediaformat müssen Sie eine Zuordnung von der eindeutigen Dateiendung zu einem MIME-Typ angeben. Wir empfehlen Ihnen dringend, dem IANA-Registrierungsprozess zu folgen.

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

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

    • Bei image/*-Dateien standardisiert MediaProvider weiterhin Exif für Metadaten. Sie können android.media.ExifInterface erweitern, um Exif-Metadaten für beliebige benutzerdefinierte Bildformate zu extrahieren und zurückzugeben.

  • Kennzeichnung für die Indexierung von Speichergeräten MediaProvider indexiert alle von StorageManager.getStorageVolumes() zurückgegebenen Volumes, wobei 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, temporäre Volumes wie USB OTG-Laufwerke einzubeziehen.

  • Ersatz des MTP-Stacks: Unter Android 11 befindet sich der MTP-Stack vollständig außerhalb der Modulgrenze und funktioniert mit öffentlichen APIs.

  • Standardausschlussliste für Ordner: MediaProvider erstellt die Standardordner Music/, Podcasts/, Ringtones/, Alarms/, Notifications/, Pictures/, Movies/, Download/, DCIM/, Documents/, Audiobooks/ und Recordings/ (das Verzeichnis Recordings/ ist unter Android 11 und niedriger nicht verfügbar) für neu eingebundene Speichermedien. Unter Android 12 und höher können Erstausrüster (OEMs) eine Liste mit Ordnern bereitstellen, die der MediaProvider bei der Standarderstellung überspringen soll. Diese Ordner, z. B. der Ordner Download/, werden möglicherweise weiterhin durch externe Logik erstellt.

Verwenden Sie das config_foldersToSkipInDefaultCreation Runtime Resource Overlay (RRO), um eine Ausschlussliste hinzuzufügen. Im Folgenden sehen Sie ein Beispiel dafür, wie Sie die Standardordner Notifications/ und Ringtones/ ausschließen:

<string-array name="config_foldersToSkipInDefaultCreation" translatable="false">
    <item>"Notifications"</item>
    <item>"Ringtones"</item>
</string-array>

Testen

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

  • Verwenden Sie Tests im Paket CtsProviderTestCases der Android Compatibility Test Suite (CTS), um die Funktionalität der öffentlichen MediaStore-APIs zu prüfen.

  • Verwenden Sie Tests in MediaProviderTests, um die Funktionalität der MediaProvider-Interna zu überprüfen.

Wenn Sie beide Testsätze zusammen ausführen möchten, verwenden Sie den folgenden atest-Befehl:

atest --test-mapping packages/providers/MediaProvider