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 almacenamiento específico seguridad modelo que se introdujo en Android 10, que incluye el ocultamiento 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. (mantener los datos sensibles de los usuarios protegidos) y agregar nuevos formatos multimedia más rápido. (proporciona coherencia a los usuarios y desarrolladores).

Cambios en Android 10

Android 10 introdujo varias mejoras relacionadas con la identificación y extracción 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 image/png y image/x-newly-invented-format son imágenes y, por lo tanto, puede describir con precisión los permisos relevantes al usuario final.

  • Determinar el tipo de MIME solo con la extensión del archivo (y sin usar detección de contenido para evitar problemas de seguridad)

  • Determinar el tipo de MIME de un archivo arbitrario usando una combinación de upstream de Debian Linux y Android mapeos.

  • Se muestran datos relevantes de los archivos video/* y audio/* (mediante MediaMetadataRetriever) y archivos 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 metadatos según conciliando los metadatos disponibles con las APIs públicas de MediaStore. Entre los cambios, se incluyen los siguientes:

    • Nueva columna is_favorite y argumento QUERY_ARG_MATCH_FAVORITE para permitir que las apps de estilo de galería filtren rápidamente el contenido multimedia en función de esta columna.

    • Indexación de metadatos del espacio de color

    • Nueva columna "is_trashed" y argumento QUERY_ARG_MATCH_TRASHED para permitir que las apps de estilo de galería filtren según esta columna.

    • Nuevas APIs que permiten la modificación masiva de varios elementos con una sola instrucción de diálogo del usuario, incluidas createDeleteRequest(), createFavoriteRequest(), createTrashRequest() y createWriteRequest().

    • Nuevas columnas GENERATION_ADDED y GENERATION_MODIFIED para usar rápidamente y detectar de manera confiable los cambios que ocurrieron desde una punto de sincronización.

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

  • Se realizaron mejoras en 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 agregando nuevos formatos multimedia, en la que se marcan los dispositivos de almacenamiento que deben indexarse y hasta se reemplaza el MTP en una pila. 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 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 de la 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 (que si personalizas MediaProvider, debes asegurarte de que tu implementación la dependencia asociada con tu personalización).

  • Cuando uses formatos de archivo multimedia personalizados o no estándar (por ejemplo, un formato generada por una aplicación de cámara específica del proveedor), debes registrar cada con MimeUtils y el módulo Extractor de medios para habilitar la indexación 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 AOSP), asegúrate de que esta dependa únicamente de las APIs públicas y del sistema para permitir que interactúe con MediaStore.

Personalización

Ahora puedes agregar nuevos formatos multimedia, influir en qué dispositivos de almacenamiento se indexan y reemplazar la pila de 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 especialmente que debes seguir la página de registro de IANA .

    • No puedes redefinir una extensión o un tipo MIME que ya esté definido en AOSP.

    • En cuanto a los archivos video/* y audio/*, MediaProvider sigue realizando consultas. MediaMetadataRetriever Usa los extractores de contenido multimedia de Android 10 para mostrar metadatos de formatos personalizados.

    • En el caso de los archivos image/*, MediaProvider continúa estandarizando en Exif para los metadatos. Puedes extender android.media.ExifInterface para 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 se muestran. antes del StorageManager.getStorageVolumes(), donde StorageVolume.getMediaStoreVolumeName() no es nulo. Puedes personalizar el una lista de volúmenes que se muestran para influir en lo que se indexa, pero recomendamos no incluidos volúmenes transitorios (como las 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 se asegura de 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 pruebas en Paquete CtsProviderTestCases del Conjunto de pruebas de compatibilidad (CTS) de Android

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

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

atest --test-mapping packages/providers/MediaProvider