À partir du 27 mars 2025, nous vous recommandons d'utiliser android-latest-release
au lieu de aosp-main
pour créer et contribuer à AOSP. Pour en savoir plus, consultez la section Modifications apportées à AOSP.
Module MediaProvider
Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Le module MediaProvider optimise les métadonnées indexées (audio, vidéo et images à partir 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 avec portée 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 de nouveaux formats multimédias plus rapidement (en offrant une cohérence aux utilisateurs et aux développeurs).
Modifications apportées 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, en particulier:
Déterminer le type de contenu du fichier à l'aide de la première partie de son type MIME
Par exemple, le système d'exploitation sait que image/png
et image/x-newly-invented-format
sont des images et peut donc décrire avec précision les autorisations pertinentes à l'utilisateur final.
Déterminer le type MIME à l'aide de l'extension de fichier uniquement (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.
Renvoie les données pertinentes à partir des fichiers video/*
et audio/*
(via MediaMetadataRetriever
) et des fichiers image/*
(via ExifInterface
).
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 les rapprochant des métadonnées disponibles avec les API publiques MediaStore. Voici quelques-unes des modifications apportées:
Nouvelle colonne is_favorite
et nouvel argument QUERY_ARG_MATCH_FAVORITE
pour permettre 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 de manière groupée à l'aide d'une seule boîte de dialogue utilisateur, y compris createDeleteRequest()
, createFavoriteRequest()
, createTrashRequest()
et createWriteRequest()
.
Nouvelles colonnes GENERATION_ADDED
et GENERATION_MODIFIED
à utiliser pour détecter rapidement et de manière fiable les modifications qui ont eu lieu 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 de SystemUI
pour écrire des 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 les appareils de stockage à indexer et même en remplaçant la pile MTP. Pour en savoir plus, consultez la section 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 à packages/providers/MediaProvider
.
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 au fournisseur), vous devez enregistrer chaque format personnalisé avec MimeUtils
et le module Media Extractor pour activer l'indexation par MediaProvider.
Pour vous assurer que MediaProvider indexe un ensemble personnalisé d'appareils de stockage (emplacements de carte SD et ports USB, par exemple) 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 qu'elle 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, influer sur les appareils de stockage indexés 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 à un type MIME. Nous vous recommandons vivement de suivre la procédure d'enregistrement IANA.
Vous ne pouvez pas redéfinir une extension ou un type MIME déjà définis dans AOSP.
Pour les fichiers video/*
et audio/*
, MediaProvider continue de consulter MediaMetadataRetriever
. Utilisez les extracteurs multimédias Android 10 pour renvoyer des métadonnées pour les formats personnalisés.
Pour les fichiers image/*
, MediaProvider continue de standardiser Exif
pour les métadonnées. Vous pouvez étendre android.media.ExifInterface
pour extraire et renvoyer des 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()
, où StorageVolume.getMediaStoreVolumeName()
n'est pas nul. Vous pouvez personnaliser la liste des volumes renvoyés pour influer sur ce qui est indexé, mais nous vous déconseillons d'inclure des volumes temporaires (tels que des clés 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.
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é Android (CTS).
Pour vérifier le fonctionnement des composants internes de MediaProvider, utilisez des tests dans MediaProviderTests
.
Pour exécuter les deux ensembles de tests ensemble, utilisez la commande atest
suivante:
atest --test-mapping packages/providers/MediaProvider
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/07/27 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/07/27 (UTC)."],[],[],null,["# MediaProvider module\n\nThe MediaProvider module optimizes indexed metadata (audio, video, and images\nfrom SD cards and USB devices) and makes that data available to apps through the\n[MediaStore public\nAPIs](https://developer.android.com/reference/android/provider/MediaStore).\nTo maintain user privacy, the MediaProvider module enforces the [scoped storage\nsecurity\nmodel](https://developer.android.com/training/data-storage/files/external-scoped)\nintroduced in Android 10, which includes redacting sensitive location metadata.\nThis module is updatable, enabling Android to respond faster to security issues\n(keeping sensitive user data protected) and add new media formats quicker\n(providing consistency to both users and developers).\n\nChanges in Android 10\n---------------------\n\nAndroid 10 introduced several improvements related to identifying and extracting\ndata from media files, specifically:\n\n- Determining the file content type using the first part of a file's MIME type.\n For example, the OS knows that both `image/png` and\n `image/x-newly-invented-format` are images, and can thus accurately describe\n relevant permissions to the end user.\n\n- Determining the MIME type using only the file extension (and without using\n [content sniffing](https://en.wikipedia.org/wiki/Content_sniffing)\n to avoid security issues).\n\n- Determining the MIME type of an arbitrary file using a combination of\n [upstream Debian Linux and Android\n mappings](https://android-review.googlesource.com/c/platform/libcore/+/735506).\n\n- Returning relevant data from `video/*` and `audio/*` files (via\n `MediaMetadataRetriever`) and `image/*` files (via `ExifInterface`).\n\nChanges in Android 11\n---------------------\n\nIn Android 11, the MediaProvider module builds on the\nchanges made in Android 10 with the following improvements:\n\n- Improvements to indexing. The MediaProvider module now indexes metadata by\n reconciling available metadata against MediaStore public APIs. Changes\n include:\n\n - New `is_favorite` column and `QUERY_ARG_MATCH_FAVORITE` argument to enable\n gallery-style apps to quickly filter media based on this column.\n\n - Indexing color space metadata.\n\n - New 'is_trashed' column and `QUERY_ARG_MATCH_TRASHED` argument to enable\n gallery-style apps to filter based on this column.\n\n - New APIs that enable bulk-modification of multiple items with a single user\n dialog prompt, including `createDeleteRequest()`, `createFavoriteRequest()`,\n `createTrashRequest()`, and `createWriteRequest()`.\n\n - New `GENERATION_ADDED` and `GENERATION_MODIFIED` columns for use in quickly\n and reliably detecting changes that have occurred since a previous\n synchronization point.\n\n - New `GROUP BY` public API for use with additional metadata columns not\n mentioned above.\n\n- Improvement to `ExifInterface` to extract metadata from PNG and WebP\n containers.\n\n- Improvements to `SystemUI` to write `DateTimeOriginal` metadata in screen\n captures.\n\nIn addition, you can now customize MediaProvider by adding new media formats,\nmarking which storage devices should be indexed, and even replacing the MTP\nstack. For details, see [Customization](#customization).\n\nModule boundary\n---------------\n\nAndroid 11 migrates all code in\n`packages/providers/MediaProvider` to a new location, with the notable exception\nof MTP-related logic. In addition,\n`frameworks/base/core/java/android/provider/MediaStore.java` is now *inside* the\nmodule boundary at `packages/providers/MediaProvider`.\n\nPackage format\n--------------\n\nThe MediaProvider module is in APK-in-APEX format.\n\nDependencies\n------------\n\nMediaProvider dependencies are related to [customizations](#customization) (that\nis, if you customize MediaProvider, you must ensure your implementation meets\nthe dependency associated with your customization).\n\n- When using custom or nonstandard media file formats (for example, a format\n generated by a vendor-specific Camera app), you must register each custom\n format with `MimeUtils` and the Media Extractor module to enable indexing by\n MediaProvider.\n\n- To ensure MediaProvider indexes a custom set of storage devices (such SD card\n slots and USB ports) used in a `StorageManagerService` implementation, set the\n `VolumeInfo.MOUNT_FLAG_INDEXABLE` flag.\n\n- When using a custom (non-AOSP) MTP implementation, ensure the implementation\n relies solely on public and system APIs to enable the implementation to\n interact with MediaStore.\n\nCustomization\n-------------\n\nYou can now add new media formats, influence which storage devices are indexed,\nand replace the MTP stack.\n\n- **Custom media formats.** For each new custom media format, you must provide a\n mapping from the unique file extension to a MIME type. We strongly encourage\n you to follow the [IANA registration\n process](https://www.iana.org/assignments/media-types/media-types.xhtml).\n\n - You can't redefine an extension or MIME type that's already defined in AOSP.\n\n - For `video/*` and `audio/*` files, MediaProvider continues consulting\n `MediaMetadataRetriever`. Use the Android 10 Media Extractors to return\n metadata for custom formats.\n\n - For `image/*` files, MediaProvider continues standardizing on `Exif` for\n metadata. You can extend `android.media.ExifInterface` to extract and return\n `Exif` metadata for any custom image formats.\n\n- **Storage devices indexing flag.** MediaProvider indexes all volumes returned\n by `StorageManager.getStorageVolumes()` where\n `StorageVolume.getMediaStoreVolumeName()` is non-null. You can customize the\n list of volumes returned to influence what is indexed, but we advise against\n including transient volumes (such as USB OTG drives).\n\n- **MTP stack replacement.** Android 11 places the MTP\n stack entirely outside the module boundary and ensures that it works against\n public APIs.\n\nTesting\n-------\n\nYou can verify the functionality of MediaProvider using the following tests:\n\n- To verify the functionality of MediaStore public APIs, use tests in the\n `CtsProviderTestCases` package of the Android Compatibility Test Suite (CTS).\n\n- To verify the functionality of MediaProvider internals, use tests in\n `MediaProviderTests`.\n\nTo run both sets of tests together, use the following `atest` command: \n\n atest --test-mapping packages/providers/MediaProvider"]]