Módulo MediaProvider

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 específico que se introdujo en Android 10, lo que incluye el ocultamiento de los metadatos de ubicación sensible. Este módulo se puede actualizar, lo que permite que Android responda más rápido a los problemas de seguridad (mantiene protegidos los datos sensibles del usuario) y agrega nuevos formatos multimedia más rápido (lo que proporciona coherencia a los usuarios y desarrolladores).

Cambios en Android 10

En Android 10, se implementaron varias mejoras relacionadas con la identificación y extracción de datos de archivos multimedia, en particular:

  • Determinar el tipo de contenido del archivo mediante la primera parte del tipo de MIME de un archivo. Por ejemplo, el SO sabe que tanto image/png como image/x-newly-invented-format son imágenes y, por lo tanto, puede describir con precisión los permisos relevantes para el usuario final.

  • Determinar el tipo de MIME solo con la extensión de archivo (y sin utilizar el análisis de contenido para evitar problemas de seguridad)

  • Determinar el tipo de MIME de un archivo arbitrario a través de una combinación de asignaciones ascendentes de Debian Linux y Android.

  • Se muestran datos relevantes de archivos video/* y audio/* (a través de MediaMetadataRetriever) y image/* (a través de ExifInterface).

Cambios en Android 11

En Android 11, el módulo MediaProvider se basa en los cambios realizados en Android 10 con las siguientes mejoras:

  • Mejoras en la indexación El módulo MediaProvider ahora indexa los metadatos mediante la conciliación de los metadatos disponibles con las APIs públicas de MediaStore. Entre los cambios, se incluyen los siguientes:

    • Se agregó una columna is_favorite y un argumento QUERY_ARG_MATCH_FAVORITE nuevos para permitir que las apps de estilo galería filtren el contenido multimedia rápidamente según esta columna.

    • Indexación de metadatos del espacio de color

    • Se agregó la columna "is_trashed" y el argumento QUERY_ARG_MATCH_TRASHED para permitir que las apps de estilo galería filtren según esta columna.

    • Nuevas APIs que permiten la modificación masiva de varios elementos con un solo mensaje de diálogo del usuario, incluidos createDeleteRequest(), createFavoriteRequest(), createTrashRequest() y createWriteRequest()

    • Columnas GENERATION_ADDED y GENERATION_MODIFIED nuevas para usar en la detección rápida y confiable de los cambios que ocurrieron desde un punto de sincronización anterior

    • Nueva API pública de GROUP BY para usar con las columnas de metadatos adicionales no mencionadas antes.

  • Mejora de ExifInterface para extraer metadatos de contenedores PNG y WebP.

  • Se realizaron mejoras en SystemUI para escribir metadatos DateTimeOriginal en capturas de pantalla.

Además, ahora puedes personalizar MediaProvider si agregas nuevos formatos de contenido multimedia, marcas qué dispositivos de almacenamiento deben indexarse y también reemplazas la pila de MTP. Para obtener más detalles, consulta Personalización.

Límite del módulo

Android 11 migra todo el código de packages/providers/MediaProvider a una ubicación nueva, con la excepción notable de la lógica relacionada con MTP. Además, frameworks/base/core/java/android/provider/MediaStore.java ahora está dentro del límite del módulo en packages/providers/MediaProvider.

Formato del paquete

El módulo MediaProvider está en formato APK-en-APEX.

Dependencias

Las dependencias de MediaProvider están relacionadas con las personalizaciones (es decir, si personalizas MediaProvider, debes asegurarte de que tu implementación cumpla con la dependencia asociada con tu personalización).

  • Cuando uses formatos de archivo multimedia personalizados o no estándar (por ejemplo, un formato generado por una app de Cámara específica del proveedor), deberás registrar cada formato personalizado con MimeUtils y el módulo Extractor de contenido multimedia para habilitar la indexación de MediaProvider.

  • Para asegurarte de que MediaProvider indexe un conjunto personalizado de dispositivos de almacenamiento (como ranuras para tarjetas SD y puertos USB) que se usa en una implementación de StorageManagerService, configura la marca VolumeInfo.MOUNT_FLAG_INDEXABLE.

  • Cuando uses una implementación de MTP personalizada (que no pertenezca al AOSP), asegúrate de que la implementación se base únicamente en las APIs públicas y del sistema para permitir que la implementación interactúe con MediaStore.

Personalización

Ahora puedes agregar nuevos formatos multimedia, influir en los dispositivos de almacenamiento que se indexan y reemplazar la pila MTP.

  • Formatos multimedia personalizados. Para cada formato multimedia personalizado nuevo, 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 la IANA.

    • No puedes redefinir una extensión o un tipo de MIME que ya se definió en AOSP.

    • En el caso de los archivos video/* y audio/*, MediaProvider sigue consultando a MediaMetadataRetriever. Usa los extractores de contenido multimedia de Android 10 a fin de mostrar metadatos para formatos personalizados.

    • En el caso de los archivos image/*, MediaProvider continúa estandarizando Exif para los metadatos. Puedes extender android.media.ExifInterface a fin de extraer y mostrar metadatos Exif para cualquier formato de imagen personalizado.

  • Marca de indexación de dispositivos de almacenamiento. MediaProvider indexa todos los volúmenes que muestra StorageManager.getStorageVolumes() en los que 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 OTG USB).

  • Reemplazo de pila de MTP. Android 11 coloca la pila de MTP fuera por completo de los límites del módulo y garantiza que funcione con las 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 en el paquete CtsProviderTestCases del Conjunto de pruebas de compatibilidad (CTS) de Android.

  • Para verificar la funcionalidad de los componentes internos de MediaProvider, usa pruebas en MediaProviderTests.

Para ejecutar ambos conjuntos de pruebas juntos, usa el siguiente comando atest:

atest --test-mapping packages/providers/MediaProvider