Module Fournisseur de médias

Le module MediaProvider optimise les métadonnées indexées (audio, vidéo et images provenant de cartes SD et de périphériques 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 étendu introduit dans Android 10, qui inclut la suppression des métadonnées de localisation sensibles. Ce module est modifiable, permettant à Android de répondre plus rapidement aux problèmes de sécurité (en protégeant les données sensibles des utilisateurs) et d'ajouter plus rapidement de nouveaux formats multimédias (offrant une cohérence aux utilisateurs et aux développeurs).

Changements dans Android 10

Android 10 a introduit plusieurs améliorations liées à l'identification et à l'extraction de données à partir de fichiers multimédias, notamment :

  • 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/png et image/x-newly-invented-format sont des images et peut ainsi décrire avec précision les autorisations pertinentes à l'utilisateur final.

  • Détermination du type MIME en utilisant uniquement l'extension du 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 .

  • Renvoi des données pertinentes à partir de fichiers video/* et audio/* (via MediaMetadataRetriever ) et de fichiers image/* (via ExifInterface ).

Changements dans 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 de l'indexation. Le module MediaProvider indexe désormais les métadonnées en réconciliant les métadonnées disponibles avec les API publiques MediaStore. Les changements incluent :

    • Nouvelle colonne is_favorite et argument QUERY_ARG_MATCH_FAVORITE pour permettre aux applications de style galerie de filtrer rapidement les mé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 qui permettent la modification groupée de plusieurs éléments avec une seule invite de dialogue utilisateur, notamment createDeleteRequest() , createFavoriteRequest() , createTrashRequest() et createWriteRequest() .

    • Nouvelles colonnes GENERATION_ADDED et GENERATION_MODIFIED à utiliser pour détecter rapidement et de manière fiable les modifications survenues 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' ExifInterface pour extraire les métadonnées des conteneurs PNG et WebP.

  • Améliorations apportées à SystemUI pour écrire les métadonnées DateTimeOriginal dans les captures d'écran.

De plus, vous pouvez désormais personnaliser MediaProvider en ajoutant de nouveaux formats multimédias, en marquant quels périphériques de stockage doivent être indexés et même en remplaçant la pile MTP. Pour plus de détails, voir Personnalisation .

Limite du module

Android 11 migre tout le code des 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 des limites du module au packages/providers/MediaProvider .

Format du colis

Le module MediaProvider est au format APK-in-APEX.

Dépendances

Les dépendances de 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 standard (par exemple, un format généré par une application Appareil photo spécifique au fournisseur), vous devez enregistrer chaque format personnalisé auprès de MimeUtils et du module Media Extractor pour activer l'indexation par MediaProvider.

  • Pour garantir 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'indicateur VolumeInfo.MOUNT_FLAG_INDEXABLE .

  • Lorsque vous utilisez une implémentation MTP personnalisée (non AOSP), assurez-vous que l'implémentation repose uniquement sur des API publiques et système pour permettre à l'implémentation d'interagir avec MediaStore.

Personnalisation

Vous pouvez désormais ajouter de nouveaux formats multimédias, influencer les périphériques de stockage à indexer et remplacer la pile MTP.

  • 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 encourageons fortement à suivre le processus d'enregistrement de l'IANA .

    • Vous ne pouvez pas redéfinir une extension ou un type MIME déjà défini dans AOSP.

    • Pour les fichiers video/* et audio/* , MediaProvider continue de consulter MediaMetadataRetriever . Utilisez les extracteurs de médias Android 10 pour renvoyer des métadonnées pour les formats personnalisés.

    • Pour les fichiers image/* , MediaProvider continue de standardiser sur Exif pour les métadonnées. Vous pouvez étendre android.media.ExifInterface pour extraire et renvoyer les métadonnées Exif 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()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 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 garantit qu'elle fonctionne avec les API publiques.

Essai

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 CtsProviderTestCases de la suite de tests de compatibilité Android (CTS).

  • 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