Módulo proveedor de medios

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 aplicaciones a través de las API públicas de MediaStore . Para mantener la privacidad del usuario, el módulo MediaProvider aplica el modelo de seguridad de almacenamiento con alcance introducido en Android 10, que incluye la redacción de metadatos de ubicación confidenciales. Este módulo es actualizable, lo que permite que Android responda más rápido a los problemas de seguridad (manteniendo protegidos los datos confidenciales del usuario) y agregue nuevos formatos de medios más rápido (brindando coherencia tanto a los usuarios como a los desarrolladores).

Cambios en Android 10

Android 10 introdujo varias mejoras relacionadas con la identificación y extracción de datos de archivos multimedia, específicamente:

  • Determinar el tipo de contenido del archivo usando la primera parte del tipo MIME de un archivo. Por ejemplo, el sistema operativo 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 MIME usando solo la extensión del archivo (y sin usar el rastreo de contenido para evitar problemas de seguridad).

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

  • Devolver datos relevantes de archivos de video/* y audio/* (a través MediaMetadataRetriever ) y archivos de image/* (a través 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 al reconciliar los metadatos disponibles con las API públicas de MediaStore. Los cambios incluyen:

    • Nueva columna is_favorite y argumento QUERY_ARG_MATCH_FAVORITE para permitir que las aplicaciones estilo galería filtren rápidamente los medios 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 aplicaciones con estilo de galería filtren según esta columna.

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

    • Nuevas columnas GENERATION_ADDED y GENERATION_MODIFIED para usar en la detección rápida y confiable de cambios que han ocurrido desde un punto de sincronización anterior.

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

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

  • Mejoras en SystemUI para escribir metadatos DateTimeOriginal en capturas de pantalla.

Además, ahora puede personalizar MediaProvider agregando nuevos formatos de medios, marcando qué dispositivos de almacenamiento deben indexarse ​​e incluso reemplazando la pila MTP. Para obtener más información, consulte 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 notable excepción 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 de 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 personaliza MediaProvider, debe asegurarse de que su implementación cumpla con la dependencia asociada con su personalización).

  • Cuando utilice formatos de archivo de medios personalizados o no estándar (por ejemplo, un formato generado por una aplicación de cámara específica del proveedor), debe registrar cada formato personalizado con MimeUtils y el módulo Media Extractor para habilitar la indexación por parte de MediaProvider.

  • Para asegurarse de que MediaProvider indexe un conjunto personalizado de dispositivos de almacenamiento (como ranuras para tarjetas SD y puertos USB) utilizados en una implementación de StorageManagerService , configure el indicador VolumeInfo.MOUNT_FLAG_INDEXABLE .

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

personalización

Ahora puede agregar nuevos formatos de medios, influir en qué dispositivos de almacenamiento se indexan y reemplazar la pila MTP.

  • Formatos de medios personalizados. Para cada nuevo formato de medios personalizado, debe proporcionar una asignación de la extensión de archivo única a un tipo MIME. Le recomendamos encarecidamente que siga el proceso de registro de la IANA .

    • No puede redefinir una extensión o tipo MIME que ya está definido en AOSP.

    • Para archivos de video/* y audio/* , MediaProvider continúa consultando MediaMetadataRetriever . Use los extractores de medios de Android 10 para devolver metadatos para formatos personalizados.

    • Para archivos de image/* , MediaProvider continúa estandarizando en Exif para metadatos. Puede extender android.media.ExifInterface para extraer y devolver metadatos Exif para cualquier formato de imagen personalizado.

  • Indicador de indexación de dispositivos de almacenamiento. MediaProvider indexa todos los volúmenes devueltos por StorageManager.getStorageVolumes() donde StorageVolume.getMediaStoreVolumeName() no es nulo. Puede personalizar la lista de volúmenes devueltos para influir en lo que se indexa, pero desaconsejamos incluir volúmenes transitorios (como unidades USB OTG).

  • Reemplazo de pila MTP. Android 11 coloca la pila MTP completamente fuera de los límites del módulo y garantiza que funcione con las API públicas.

Pruebas

Puede verificar la funcionalidad de MediaProvider utilizando las siguientes pruebas:

  • Para verificar la funcionalidad de las API públicas de MediaStore, use pruebas en el paquete CtsProviderTestCases de Android Compatibility Test Suite (CTS).

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

Para ejecutar ambos conjuntos de pruebas a la vez, use el siguiente comando atest :

atest --test-mapping packages/providers/MediaProvider