MediaStore API es una interfaz de Android para acceder a los archivos multimedia compartidos del dispositivo: imágenes, videos, audio y documentos. A diferencia del acceso directo a archivos, MediaStore funciona a través de una base de datos multimedia centralizada y un proveedor de contenido. Según la documentación para desarrolladores de Android (2025), a partir de Android 10 la API se convirtió en el mecanismo principal para trabajar con medios, reemplazando el obsoleto READ_EXTERNAL_STORAGE. Los desarrolladores usan MediaStore en galerías, reproductores de música, cámaras y administradores de archivos.
Puntos clave
MediaStore API es un proveedor de contenido del sistema en la plataforma Android diseñado para indexar, almacenar y proporcionar acceso a los archivos multimedia del dispositivo. La API forma parte del SDK de Android y está disponible desde el nivel de API 1.
MediaStore funciona a través de una base de datos multimedia unificada que escanea automáticamente el dispositivo y recopila metadatos de todos los archivos multimedia. La base de datos se actualiza por el sistema cuando se añaden, modifican o eliminan archivos, por lo que las aplicaciones siempre reciben información actualizada sin escaneo manual.
Las tablas principales de MediaStore son: Images (imágenes), Video (videos), Audio (audio) y Files (archivos generales). Cada tabla contiene columnas con metadatos: nombre, fecha de creación, tamaño, tipo MIME, coordenadas GPS y otros atributos.
Antes de Android 10, los desarrolladores usaban READ_EXTERNAL_STORAGE para acceder a todos los archivos del dispositivo. Android 10 (API 29) introdujo Scoped Storage: las aplicaciones solo podían acceder a sus propios archivos y a través de MediaStore. Android 11 endureció la política, bloqueando por completo la ruta directa a los directorios compartidos.
A partir de Android 13 (API 33), Google reemplazó READ_EXTERNAL_STORAGE con permisos granulares: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO y READ_MEDIA_AUDIO. Esto permite a los usuarios otorgar acceso solo a tipos específicos de medios sin exponer todo el almacenamiento.
MediaStore está construido sobre una arquitectura de proveedor de contenido: cada aplicación accede a él a través de ContentResolver y Uri. El escáner multimedia del sistema — MediaScannerConnection — indexa automáticamente todos los archivos del dispositivo durante el arranque, la conexión USB o el reinicio.
La base de datos multimedia se almacena en la base de datos del sistema y contiene registros para cada archivo multimedia. Las columnas difieren según el tipo: las imágenes tienen ORIENTATION y DATE_TAKEN, los videos tienen DURATION, los archivos de audio tienen ARTIST y ALBUM. Los desarrolladores pueden ejecutar consultas similares a SQL usando query con projection y selection para filtrar.
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))
}
}
Cada archivo multimedia se identifica mediante un Content URI como content://media/external/images/media/1234. El URI externo apunta al almacenamiento compartido, mientras que el interno apunta a los archivos multimedia del sistema. Usar URI en lugar de rutas de archivo es una ventaja clave de MediaStore: la aplicación no necesita acceso al sistema de archivos y funciona a través de un proveedor de contenido seguro.
MediaStore admite cuatro tipos principales de medios, cada uno con su propia tabla y conjunto de metadatos. Los desarrolladores seleccionan la tabla adecuada según el tipo de contenido con el que trabaja la aplicación.
Además de las columnas estándar, cada tabla contiene campos del sistema: _ID, DATA (obsoleto), SIZE, MIME_TYPE, DATE_ADDED, DATE_MODIFIED. Desde Android 10, el campo DATA está marcado como obsoleto, y los desarrolladores deben trabajar abriendo un InputStream a través de URI.
MediaStore requiere permisos explícitos, que difieren según la versión de Android. Antes de Android 13, se usaba el permiso único READ_EXTERNAL_STORAGE. A partir de Android 13 (API 33), Google introdujo permisos granulares para cada tipo de medio.
| Tipo de medio | Permiso (API 33+) | Anterior (API 29–32) |
|---|---|---|
| Imágenes | READ_MEDIA_IMAGES | READ_EXTERNAL_STORAGE |
| Video | READ_MEDIA_VIDEO | READ_EXTERNAL_STORAGE |
| Audio | READ_MEDIA_AUDIO | READ_EXTERNAL_STORAGE |
| Escritura | WRITE_EXTERNAL_STORAGE | WRITE_EXTERNAL_STORAGE |
Escribir en MediaStore también requiere WRITE_EXTERNAL_STORAGE para Android 9 e inferiores. A partir de Android 10, una aplicación puede escribir sus propios archivos en MediaStore sin permisos adicionales — el sistema concede acceso automáticamente al insertar un registro mediante ContentResolver.insert.
Los permisos de MediaStore se solicitan a través del mecanismo estándar ActivityResultContracts.RequestMultiplePermissions. El usuario puede denegar la solicitud, y la aplicación debe manejar este escenario correctamente. Se recomienda verificar el permiso mediante ContextCompat.checkSelfPermission antes de cada acceso a MediaStore.
MediaStore permite no solo leer, sino también escribir archivos multimedia. Para escribir una imagen o video, el desarrollador usa ContentResolver.insert y abre un OutputStream para la URI devuelta. El sistema añade automáticamente el archivo a la base de datos multimedia y lo indexa.
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 ->
// escribir bytes al flujo
}
}
La eliminación se realiza mediante ContentResolver.delete con la URI del archivo. El sistema verifica los derechos de acceso: si el archivo pertenece a la aplicación actual, la eliminación ocurre sin permisos adicionales. Para archivos de otras aplicaciones en Android 10+, se requiere la confirmación del usuario a través de un diálogo del sistema.
MediaStore API se diferencia fundamentalmente del acceso directo a archivos mediante File API. En lugar de rutas de archivo, se usan Content URI, y en lugar de operaciones de archivo, se usan métodos de ContentResolver. Esto proporciona tres ventajas clave: seguridad, indexación automática e interfaz unificada.
El acceso directo a archivos está restringido en Android 10+ para directorios compartidos. MediaStore sigue siendo la única forma de leer medios de Pictures, DCIM, Movies, Music y Download. Para archivos específicos de la aplicación (app-specific storage), el acceso directo se conserva — son las carpetas en Android/data y Android/media.
La elección entre MediaStore y el acceso directo depende del tipo de contenido. MediaStore es obligatorio para archivos multimedia compartidos accesibles por otras aplicaciones. La API de archivos directa es adecuada para archivos internos de la aplicación y caché. Storage Access Framework se usa para seleccionar documentos arbitrarios a través del selector del sistema.
Preguntas frecuentes
MediaStore API es el proveedor de contenido del sistema Android para acceder a archivos multimedia del dispositivo: imágenes, videos, audio y documentos. La API proporciona una interfaz unificada a través de ContentResolver y una base de datos multimedia que indexa automáticamente todos los archivos.
MediaStore admite Images (imágenes), Video (videos), Audio (audio) y Files (documentos). Cada tipo tiene su propia tabla con su propio conjunto de metadatos: las imágenes tienen ORIENTATION, los videos tienen DURATION, los archivos de audio tienen ARTIST.
En Android 13+ se usan permisos granulares: READ_MEDIA_IMAGES para imágenes, READ_MEDIA_VIDEO para video y READ_MEDIA_AUDIO para audio. El usuario puede otorgar acceso solo a tipos específicos de medios.
Para escribir, crea ContentValues con el nombre y tipo MIME, llama a ContentResolver.insert para obtener un URI, luego abre un OutputStream mediante ContentResolver.openOutputStream. El sistema indexa automáticamente el nuevo archivo.
MediaStore proporciona acceso programático a todos los archivos multimedia del dispositivo a través de una base de datos multimedia. Storage Access Framework abre un diálogo de selección de archivos del sistema y devuelve un URI — el usuario selecciona un archivo o carpeta específicos.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también