Le module MediaProvider optimise les métadonnées indexées (audio, vidéo et images provenant de cartes SD et d'appareils USB) et met ces données à la disposition des applications via les API publiques MediaStore. Pour préserver la confidentialité des utilisateurs, le module MediaProvider applique le modèle de sécurité du stockage étendu introduit dans Android 10, qui inclut la suppression des métadonnées de localisation sensibles. Ce module est actualisable, ce qui permet à Android de répondre plus rapidement aux problèmes de sécurité (en protégeant les données utilisateur sensibles) et d'ajouter plus rapidement de nouveaux formats multimédias (en offrant une cohérence aux utilisateurs et aux développeurs).
Modifications apportées à Android 10
Android 10 a introduit plusieurs améliorations liées à l'identification et à l'extraction de données à partir de fichiers multimédias, en particulier :
Détermination du type de contenu du fichier à l'aide de la première partie du type MIME d'un fichier. Par exemple, l'OS sait que
image/png
etimage/x-newly-invented-format
sont des images, et peut donc décrire précisément les autorisations pertinentes à l'utilisateur final.Déterminer le type MIME en utilisant uniquement l'extension de fichier (et sans utiliser le reniflage de contenu pour éviter les problèmes de sécurité).
Détermination du type MIME d'un fichier arbitraire à l'aide d'une combinaison de mappages Debian Linux et Android en amont.
Renvoyer les données pertinentes des fichiers
video/*
etaudio/*
(viaMediaMetadataRetriever
) et des fichiersimage/*
(viaExifInterface
).
Modifications apportées à Android 11
Dans Android 11, le module MediaProvider s'appuie sur les modifications apportées dans Android 10 avec les améliorations suivantes :
Améliorations apportées à l'indexation. Le module MediaProvider indexe désormais les métadonnées en rapprochant les métadonnées disponibles des API publiques MediaStore. Voici quelques exemples de modifications :
Nouvelle colonne
is_favorite
et nouvel argumentQUERY_ARG_MATCH_FAVORITE
permettant aux applications de style galerie de filtrer rapidement les contenus multimédias en fonction de cette colonne.Indexation des métadonnées de l'espace colorimétrique.
Nouvelle colonne "is_trashed" et argument
QUERY_ARG_MATCH_TRASHED
pour permettre aux applications de style galerie de filtrer en fonction de cette colonne.Nouvelles API permettant de modifier plusieurs éléments à la fois avec une seule invite de boîte de dialogue utilisateur, y compris
createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
etcreateWriteRequest()
.Nouvelles colonnes
GENERATION_ADDED
etGENERATION_MODIFIED
permettant de détecter rapidement et de manière fiable les modifications apportées depuis un point de synchronisation précédent.Nouvelle API publique
GROUP BY
à utiliser avec des colonnes de métadonnées supplémentaires non mentionnées ci-dessus.
Amélioration de
ExifInterface
pour extraire les métadonnées des conteneurs PNG et WebP.Améliorations apportées à
SystemUI
pour écrire des métadonnéesDateTimeOriginal
dans les captures d'écran.
De plus, vous pouvez désormais personnaliser MediaProvider en ajoutant de nouveaux formats multimédias, en indiquant les périphériques de stockage à indexer et même en remplaçant la pile MTP. Pour en savoir plus, consultez Personnalisation.
Limite du module
Android 11 migre tout le code de packages/providers/MediaProvider
vers un nouvel emplacement, à l'exception notable de la logique liée à MTP. De plus, frameworks/base/core/java/android/provider/MediaStore.java
est désormais à l'intérieur de la limite du module à packages/providers/MediaProvider
.
Format du package
Le module MediaProvider est au format APK-in-APEX.
Dépendances
Les dépendances MediaProvider sont liées aux personnalisations (c'est-à-dire que si vous personnalisez MediaProvider, vous devez vous assurer que votre implémentation répond à la dépendance associée à votre personnalisation).
Lorsque vous utilisez des formats de fichiers multimédias personnalisés ou non standards (par exemple, un format généré par une application d'appareil photo spécifique à un fournisseur), vous devez enregistrer chaque format personnalisé avec
MimeUtils
et le module Media Extractor pour permettre l'indexation par MediaProvider.Pour vous assurer que MediaProvider indexe un ensemble personnalisé de périphériques de stockage (tels que les emplacements pour carte SD et les ports USB) utilisés dans une implémentation
StorageManagerService
, définissez l'indicateurVolumeInfo.MOUNT_FLAG_INDEXABLE
.Lorsque vous utilisez une implémentation MTP personnalisée (non-AOSP), assurez-vous qu'elle repose uniquement sur des API publiques et système pour pouvoir interagir avec MediaStore.
Personnalisation
Vous pouvez désormais ajouter de nouveaux formats multimédias, influencer les périphériques de stockage indexés et remplacer la pile MTP.
Formats média personnalisés : Pour chaque nouveau format multimédia personnalisé, vous devez fournir un mappage de l'extension de fichier unique vers un type MIME. Nous vous encourageons vivement à suivre la procédure d'enregistrement de l'IANA.
Vous ne pouvez pas redéfinir une extension ou un type MIME déjà définis dans AOSP.
Pour les fichiers
video/*
etaudio/*
, MediaProvider continue de consulterMediaMetadataRetriever
. Utilisez les extracteurs de contenu multimédia Android 10 pour renvoyer les métadonnées des formats personnalisés.Pour les fichiers
image/*
, MediaProvider continue de standardiserExif
pour les métadonnées. Vous pouvez étendreandroid.media.ExifInterface
pour extraire et renvoyer les métadonnéesExif
pour tous les formats d'image personnalisés.
Indicateur d'indexation des périphériques de stockage. MediaProvider indexe tous les volumes renvoyés par
StorageManager.getStorageVolumes()
oùStorageVolume.getMediaStoreVolumeName()
n'est pas nul. Vous pouvez personnaliser la liste des volumes renvoyés pour influencer ce qui est indexé, mais nous vous déconseillons d'inclure les volumes transitoires (tels que les lecteurs USB OTG).Remplacement de la pile MTP. Android 11 place la pile MTP entièrement en dehors des limites du module et s'assure qu'elle fonctionne avec les API publiques.
Tests
Vous pouvez vérifier le fonctionnement de MediaProvider à l'aide des tests suivants :
Pour vérifier le fonctionnement des API publiques MediaStore, utilisez les tests du package
CtsProviderTestCases
de la suite de tests de compatibilité (CTS) Android.Pour vérifier le fonctionnement des composants internes de MediaProvider, utilisez les tests dans
MediaProviderTests
.
Pour exécuter les deux ensembles de tests ensemble, utilisez la commande atest
suivante :
atest --test-mapping packages/providers/MediaProvider