MediaStore API est une interface Android pour accéder aux fichiers multimédias partagés de l'appareil : images, vidéos, audio et documents. Contrairement à l'accès direct aux fichiers, MediaStore fonctionne via une base de données multimédia centralisée et un fournisseur de contenu. Selon la documentation Android Developers (2025), à partir d'Android 10, l'API est devenue le mécanisme principal pour travailler avec les médias, remplaçant l'obsolète READ_EXTERNAL_STORAGE. Les développeurs utilisent MediaStore dans les galeries, lecteurs musique, appareils photo et gestionnaires de fichiers.
Points clés
MediaStore API est un fournisseur de contenu système sur la plateforme Android conçu pour indexer, stocker et fournir l'accès aux fichiers multimédias de l'appareil. L'API fait partie du SDK Android et est disponible depuis le niveau d'API 1.
MediaStore fonctionne via une base de données multimédia unifiée qui analyse automatiquement l'appareil et collecte les métadonnées de tous les fichiers multimédias. La base de données est mise à jour par le système lors de l'ajout, la modification ou la suppression de fichiers, donc les applications reçoivent toujours des informations à jour sans analyse manuelle.
Les principales tables de MediaStore sont : Images (images), Video (vidéos), Audio (fichiers audio) et Files (fichiers généraux). Chaque table contient des colonnes avec des métadonnées : nom, date de création, taille, type MIME, coordonnées GPS et autres attributs.
Avant Android 10, les développeurs utilisaient READ_EXTERNAL_STORAGE pour accéder à tous les fichiers de l'appareil. Android 10 (API 29) a introduit Scoped Storage : les applications ne pouvaient accéder qu'à leurs propres fichiers et via MediaStore. Android 11 a renforcé la politique, bloquant complètement le chemin direct vers les répertoires partagés.
À partir d'Android 13 (API 33), Google a remplacé READ_EXTERNAL_STORAGE par des autorisations granulaires : READ_MEDIA_IMAGES, READ_MEDIA_VIDEO et READ_MEDIA_AUDIO. Cela permet aux utilisateurs d'accorder l'accès uniquement à des types de médias spécifiques sans exposer tout le stockage.
MediaStore est construit sur une architecture de fournisseur de contenu : chaque application y accède via ContentResolver et Uri. Le scanner multimédia système — MediaScannerConnection — indexe automatiquement tous les fichiers de l'appareil au démarrage, à la connexion USB ou au redémarrage.
La base de données multimédia est stockée dans la base de données système et contient des enregistrements pour chaque fichier multimédia. Les colonnes diffèrent selon le type : les images ont ORIENTATION et DATE_TAKEN, les vidéos ont DURATION, les fichiers audio ont ARTIST et ALBUM. Les développeurs peuvent exécuter des requêtes de type SQL avec query, projection et selection pour filtrer.
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATE_ADDED
)
val cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
null,
null,
MediaStore.Images.Media.DATE_ADDED + " DESC"
)
cursor?.use {
while (moveToNext()) {
val name = getString(getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME))
}
}
Chaque fichier multimédia est identifié par une Content URI comme content://media/external/images/media/1234. L'URI externe pointe vers le stockage partagé, tandis que l'URI interne pointe vers les fichiers multimédias système. Utiliser des URI au lieu de chemins de fichier est un avantage clé de MediaStore : l'application n'a pas besoin d'accès au système de fichiers et fonctionne via un fournisseur de contenu sécurisé.
MediaStore prend en charge quatre types principaux de médias, chacun avec sa propre table et son propre ensemble de métadonnées. Les développeurs sélectionnent la table appropriée en fonction du type de contenu avec lequel leur application travaille.
En plus des colonnes standard, chaque table contient des champs système : _ID, DATA (obsolète), SIZE, MIME_TYPE, DATE_ADDED, DATE_MODIFIED. Depuis Android 10, le champ DATA est marqué comme obsolète, et les développeurs doivent travailler en ouvrant un InputStream via URI.
MediaStore nécessite des autorisations explicites, qui diffèrent selon la version d'Android. Avant Android 13, l'autorisation unique READ_EXTERNAL_STORAGE était utilisée. À partir d'Android 13 (API 33), Google a introduit des autorisations granulaires pour chaque type de média.
| Type de média | Autorisation (API 33+) | Ancienne (API 29–32) |
|---|---|---|
| Images | READ_MEDIA_IMAGES | READ_EXTERNAL_STORAGE |
| Vidéo | READ_MEDIA_VIDEO | READ_EXTERNAL_STORAGE |
| Audio | READ_MEDIA_AUDIO | READ_EXTERNAL_STORAGE |
| Écriture | WRITE_EXTERNAL_STORAGE | WRITE_EXTERNAL_STORAGE |
L'écriture dans MediaStore nécessite également WRITE_EXTERNAL_STORAGE pour Android 9 et inférieur. À partir d'Android 10, une application peut écrire ses propres fichiers dans MediaStore sans autorisations supplémentaires — le système accorde automatiquement l'accès lors de l'insertion d'un enregistrement via ContentResolver.insert.
Les autorisations MediaStore sont demandées via le mécanisme standard ActivityResultContracts.RequestMultiplePermissions. L'utilisateur peut refuser la demande, et l'application doit gérer correctement ce scénario. Il est recommandé de vérifier l'autorisation via ContextCompat.checkSelfPermission avant chaque accès à MediaStore.
MediaStore permet non seulement de lire mais aussi d'écrire des fichiers multimédia. Pour écrire une image ou une vidéo, le développeur utilise ContentResolver.insert et ouvre un OutputStream pour l'URI retourné. Le système ajoute automatiquement le fichier à la base de données multimédia et l'indexe.
val values = ContentValues().apply {
put(MediaStore.Images.Media.DISPLAY_NAME, "photo_2025.jpg")
put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/MyApp")
}
val uri = contentResolver?.insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values
)
uri?.let {
val outputStream = contentResolver?.openOutputStream(it)
outputStream?.use { stream ->
// écrire des octets dans le flux
}
}
La suppression est effectuée via ContentResolver.delete avec l'URI du fichier. Le système vérifie les droits d'accès : si le fichier appartient à l'application actuelle, la suppression se produit sans autorisations supplémentaires. Pour les fichiers d'autres applications sur Android 10+, une confirmation de l'utilisateur via une boîte de dialogue système est requise.
MediaStore API diffère fondamentalement de l'accès direct aux fichiers via l'API File. Au lieu de chemins de fichier, des Content URI sont utilisés, et au lieu d'opérations sur les fichiers, des méthodes ContentResolver sont utilisées. Cela offre trois avantages clés : sécurité, indexation automatique et interface unifiée.
L'accès direct aux fichiers est restreint sur Android 10+ pour les répertoires partagés. MediaStore reste le seul moyen de lire les médias depuis Pictures, DCIM, Movies, Music et Download. Pour les fichiers spécifiques à l'application (app-specific storage), l'accès direct est préservé — ce sont les dossiers dans Android/data et Android/media.
Le choix entre MediaStore et l'accès direct dépend du type de contenu. MediaStore est obligatoire pour les fichiers multimédias partagés accessibles par d'autres applications. L'API File directe convient aux fichiers internes de l'application et au cache. Le Storage Access Framework est utilisé pour sélectionner des documents arbitraires via le sélecteur système.
Questions fréquentes
MediaStore API est le fournisseur de contenu système Android pour accéder aux fichiers multimédia de l'appareil : images, vidéos, audio et documents. L'API fournit une interface unifiée via ContentResolver et une base de données multimédia qui indexe automatiquement tous les fichiers.
MediaStore prend en charge Images (images), Video (vidéos), Audio (fichiers audio) et Files (documents). Chaque type a sa propre table avec son propre ensemble de métadonnées : les images ont ORIENTATION, les vidéos ont DURATION, les fichiers audio ont ARTIST.
Sur Android 13+, des autorisations granulaires sont utilisées : READ_MEDIA_IMAGES pour les images, READ_MEDIA_VIDEO pour les vidéos et READ_MEDIA_AUDIO pour l'audio. L'utilisateur peut accorder l'accès uniquement à des types de médias spécifiques.
Pour écrire, créez ContentValues avec le nom et le type MIME, appelez ContentResolver.insert pour obtenir un URI, puis ouvrez un OutputStream via ContentResolver.openOutputStream. Le système indexe automatiquement le nouveau fichier.
MediaStore fournit un accès programmatique à tous les fichiers multimédia de l'appareil via une base de données multimédia. Storage Access Framework ouvre une boîte de dialogue de sélection de fichiers système et retourne un URI — l'utilisateur sélectionne un fichier ou dossier spécifique.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi