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é de stockage limité introduit dans Android 10, qui inclut la suppression des métadonnées de localisation sensibles. Ce module est évolutif, 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, le système d'exploitation sait que
image/pngetimage/x-newly-invented-formatsont des images, et peut donc décrire avec précision les autorisations pertinentes à l'utilisateur final.Détermination du type MIME à l'aide de l'extension de fichier uniquement (et sans utiliser la détection 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.
Renvoi des données pertinentes à partir 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 à Android 10 avec les améliorations suivantes :
Améliorations de l'indexation. Le module MediaProvider indexe désormais les métadonnées en les comparant aux API publiques MediaStore. Voici quelques modifications :
Nouvelle colonne
is_favoriteet nouvel argumentQUERY_ARG_MATCH_FAVORITEpour permettre aux applications de type 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_trashedet nouvel argumentQUERY_ARG_MATCH_TRASHEDpour permettre aux applications de type galerie de filtrer en fonction de cette colonne.Nouvelles API permettant de modifier en bloc plusieurs éléments avec une seule invite de dialogue utilisateur, y compris
createDeleteRequest(),createFavoriteRequest(),createTrashRequest()etcreateWriteRequest().Nouvelles colonnes
GENERATION_ADDEDetGENERATION_MODIFIEDà utiliser pour 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 d'
ExifInterfacepour extraire les métadonnées des conteneurs PNG et WebP.Améliorations apportées à
SystemUIpour écrire les métadonnéesDateTimeOriginaldans 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 se trouve désormais à l'intérieur de la limite du module dans 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é auprès de
MimeUtilset du module Media Extractor pour activer l'indexation par MediaProvider.Pour vous assurer que MediaProvider indexe un ensemble personnalisé de périphériques de stockage (tels que des emplacements pour carte SD et des 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 permettre à l'implémentation d'interagir avec MediaStore.
Personnalisation
Vous pouvez ajouter de nouveaux formats multimédias, influencer les périphériques de stockage indexés, remplacer la pile MTP et exclure la création de dossiers par défaut.
Formats multimédias 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 recommandons vivement de suivre le processus d'enregistrement IANA.
Vous ne pouvez pas redéfinir une extension ou un type MIME déjà défini dans AOSP.
Pour les fichiers
video/*etaudio/*, MediaProvider continue de consulterMediaMetadataRetriever. Utilisez les extracteurs de contenus multimédias Android 10 pour renvoyer les métadonnées des formats personnalisés.Pour les fichiers
image/*, MediaProvider continue de standardiserExifpour les métadonnées. Vous pouvez étendreandroid.media.ExifInterfacepour extraire et renvoyerExifles métadonnées 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 des volumes temporaires (tels que des lecteurs USB OTG).Remplacement de la pile MTP Android 11 place la pile MTP entièrement en dehors de la limite du module et s'assure qu'elle fonctionne avec les API publiques.
Liste d'exclusion des dossiers par défaut MediaProvider crée les dossiers par défaut
Music/,Podcasts/,Ringtones/,Alarms/,Notifications/,Pictures/,Movies/,Download/,DCIM/,Documents/,Audiobooks/, etRecordings/(le répertoireRecordings/n'est pas disponible sur Android 11 et versions antérieures) pour les volumes de stockage nouvellement montés. Sur Android 12 et versions ultérieures, les fabricants d'équipement d'origine (OEM) peuvent fournir une liste d'exclusion non sensible à la casse pour les dossiers que MediaProvider doit ignorer lors de la création par défaut. Ces dossiers, par exemple le dossierDownload/, peuvent toujours être créés par une logique externe.
Pour ajouter une liste d'exclusion, utilisez la config_foldersToSkipInDefaultCreation
superposition de ressources d'exécution (RRO). Voici un exemple d'exclusion des dossiers par défaut Notifications/ et Ringtones/ :
<string-array name="config_foldersToSkipInDefaultCreation" translatable="false">
<item>"Notifications"</item>
<item>"Ringtones"</item>
</string-array>
Tests
Vous pouvez vérifier la fonctionnalité de MediaProvider à l'aide des tests suivants :
Pour vérifier la fonctionnalité des API publiques MediaStore, utilisez les tests du package
CtsProviderTestCasesde l'outil Compatibility Test Suite (CTS) Android.Pour vérifier la fonctionnalité 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