El módulo MediaProvider optimiza los metadatos indexados (audio, video e imágenes de tarjetas SD y dispositivos USB) y pone esos datos a disposición de las apps a través de las APIs públicas de MediaStore. Para mantener la privacidad del usuario, el módulo MediaProvider aplica el modelo de seguridad de almacenamiento con alcance que se introdujo en Android 10, que incluye la ocultación de metadatos de ubicación sensibles. Este módulo se puede actualizar, lo que permite que Android responda más rápido a los problemas de seguridad (manteniendo protegidos los datos sensibles del usuario) y agregue nuevos formatos de medios más rápido (lo que brinda coherencia tanto a los usuarios como a los desarrolladores).
Cambios en Android 10
Android 10 introdujo varias mejoras relacionadas con la identificación y la extracción de datos de archivos multimedia, específicamente:
- Determina el tipo de contenido del archivo con la primera parte del tipo de MIME del archivo. Por ejemplo, el SO sabe que - image/pngy- image/x-newly-invented-formatson imágenes, por lo que puede describir con precisión los permisos pertinentes al usuario final.
- Determina el tipo de MIME solo con la extensión del archivo (y sin usar la detección de contenido para evitar problemas de seguridad). 
- Determinar el tipo de MIME de un archivo arbitrario con una combinación de asignaciones upstream de Debian Linux y Android 
- Devuelve datos relevantes de los archivos - video/*y- audio/*(a través de- MediaMetadataRetriever) y los archivos- image/*(a través de- ExifInterface).
Cambios en Android 11
En Android 11, el módulo de MediaProvider se basa en los cambios realizados en Android 10 con las siguientes mejoras:
- Se realizaron mejoras en la indexación. El módulo MediaProvider ahora indexa los metadatos reconciliando los metadatos disponibles con las APIs públicas de MediaStore. Los cambios incluyen lo siguiente: - Se agregaron la columna - is_favoritey el argumento- QUERY_ARG_MATCH_FAVORITEnuevos para permitir que las apps de estilo galería filtren rápidamente el contenido multimedia en función de esta columna.
- Indexa los metadatos del espacio de color. 
- Se agregaron la nueva columna "is_trashed" y el argumento - QUERY_ARG_MATCH_TRASHEDpara permitir que las apps de estilo galería filtren en función de esta columna.
- Nuevas APIs que permiten la modificación masiva de varios elementos con un solo mensaje de diálogo del usuario, incluidas - createDeleteRequest(),- createFavoriteRequest(),- createTrashRequest()y- createWriteRequest().
- Nuevas columnas - GENERATION_ADDEDy- GENERATION_MODIFIEDpara detectar de forma rápida y confiable los cambios que se produjeron desde un punto de sincronización anterior.
- Nueva API pública de - GROUP BYpara usar con columnas de metadatos adicionales no mencionadas anteriormente.
 
- Se mejoró - ExifInterfacepara extraer metadatos de contenedores PNG y WebP.
- Se realizaron mejoras en - SystemUIpara escribir metadatos de- DateTimeOriginalen capturas de pantalla.
Además, ahora puedes personalizar MediaProvider agregando nuevos formatos de medios, marcando qué dispositivos de almacenamiento se deben indexar y hasta reemplazando la pila de MTP. Para obtener más información, consulta Personalización.
Límite del módulo
Android 11 migra todo el código en packages/providers/MediaProvider a una nueva ubicación, con la excepción notable de la lógica relacionada con MTP. Además, frameworks/base/core/java/android/provider/MediaStore.java ahora se encuentra dentro del límite del módulo en packages/providers/MediaProvider.
Formato del paquete
El módulo MediaProvider está en formato APK-in-APEX.
Dependencias
Las dependencias de MediaProvider se relacionan con las personalizaciones (es decir, si personalizas MediaProvider, debes asegurarte de que tu implementación cumpla con la dependencia asociada a tu personalización).
- Cuando uses formatos de archivo multimedia personalizados o no estándares (por ejemplo, un formato generado por una app de Cámara específica del proveedor), debes registrar cada formato personalizado con - MimeUtilsy el módulo Media Extractor para habilitar la indexación por parte de MediaProvider.
- Para garantizar que MediaProvider indexe un conjunto personalizado de dispositivos de almacenamiento (como ranuras para tarjetas SD y puertos USB) que se usan en una implementación de - StorageManagerService, establece la marca- VolumeInfo.MOUNT_FLAG_INDEXABLE.
- Cuando uses una implementación de MTP personalizada (no de AOSP), asegúrate de que la implementación se base únicamente en APIs públicas y del sistema para permitir que interactúe con MediaStore. 
Personalización
Ahora puedes agregar nuevos formatos de medios, influir en qué dispositivos de almacenamiento se indexan y reemplazar la pila de MTP.
- Formatos de medios personalizados. Para cada nuevo formato de medios personalizado, debes proporcionar una asignación de la extensión de archivo única a un tipo de MIME. Te recomendamos que sigas el proceso de registro de IANA. - No puedes redefinir una extensión o un tipo de MIME que ya estén definidos en el AOSP. 
- En el caso de los archivos - video/*y- audio/*, MediaProvider sigue consultando- MediaMetadataRetriever. Usa los extractores de medios de Android 10 para devolver metadatos de formatos personalizados.
- En el caso de los archivos - image/*, MediaProvider sigue estandarizando- Exifpara los metadatos. Puedes extender- android.media.ExifInterfacepara extraer y devolver metadatos de- Exifpara cualquier formato de imagen personalizado.
 
- Es la marca de indexación de los dispositivos de almacenamiento. MediaProvider indexa todos los volúmenes que devuelve - StorageManager.getStorageVolumes(), donde- StorageVolume.getMediaStoreVolumeName()no es nulo. Puedes personalizar la lista de volúmenes que se muestran para influir en lo que se indexa, pero te recomendamos que no incluyas volúmenes transitorios (como unidades USB OTG).
- Reemplazo de la pila de MTP. Android 11 coloca la pila de MTP completamente fuera del límite del módulo y garantiza que funcione con APIs públicas. 
Prueba
Puedes verificar la funcionalidad de MediaProvider con las siguientes pruebas:
- Para verificar la funcionalidad de las APIs públicas de MediaStore, usa las pruebas del paquete - CtsProviderTestCasesdel Conjunto de pruebas de compatibilidad (CTS) de Android.
- Para verificar la funcionalidad de los elementos internos de MediaProvider, usa las pruebas en - MediaProviderTests.
Para ejecutar ambos conjuntos de pruebas juntos, usa el siguiente comando atest:
atest --test-mapping packages/providers/MediaProvider