El módulo MediaProvider optimiza los metadatos indexados (audio, video e imágenes) desde tarjetas SD y dispositivos USB) y pone esos datos a disposición de las aplicaciones a través de la MediaStore public APIs. Para mantener la privacidad del usuario, el módulo MediaProvider aplica el almacenamiento específico seguridad modelo que se introdujo en Android 10, lo 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 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 Lasimage/x-newly-invented-format
son imágenes y, por lo tanto, pueden describir con precisión los permisos relevantes del usuario final.Determinar el tipo de MIME solo usando la extensión de archivo (y sin usar sniffing 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/*
yaudio/*
(medianteMediaMetadataRetriever
) y archivosimage/*
(a través deExifInterface
).
Cambios en Android 11
En Android 11, el módulo MediaProvider se basa en 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. Cambios incluyen:
Nueva columna
is_favorite
y argumentoQUERY_ARG_MATCH_FAVORITE
para habilitar con estilo de galería para filtrar rápidamente el contenido multimedia según esta columna.Indexación de metadatos del espacio de color
Nuevo "is_trashed" y el argumento
QUERY_ARG_MATCH_TRASHED
para habilitar de estilo galería para filtrar según esta columna.Nuevas APIs que permiten la modificación masiva de varios elementos con un solo usuario mensaje de diálogo, que incluye
createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
ycreateWriteRequest()
.Nuevas columnas
GENERATION_ADDED
yGENERATION_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.
Mejora de
ExifInterface
para extraer metadatos de PNG y WebP contenedores.Mejoras en
SystemUI
para escribir metadatos deDateTimeOriginal
en la pantalla captura.
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 detalles, 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 asegurarte de que MediaProvider indexe un conjunto personalizado de dispositivos de almacenamiento (como tarjetas SD ranuras y puertos USB) que se usan en una implementación de
StorageManagerService
, establece elVolumeInfo.MOUNT_FLAG_INDEXABLE
.Cuando uses una implementación de MTP personalizada (no del AOSP), asegúrate de que depende únicamente de APIs públicas y del sistema para permitir la implementación para interactuar 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 de medios personalizado nuevo, debes proporcionar un 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 de MIME que ya se definió en AOSP.
En cuanto a los archivos
video/*
yaudio/*
, MediaProvider sigue realizando consultas.MediaMetadataRetriever
Usa el extractor de medios de Android 10 para mostrar metadatos para formatos personalizados.En el caso de los archivos
image/*
, MediaProvider continúa estandarizando enExif
para metadatos. Puedes extenderandroid.media.ExifInterface
para extraer y mostrar resultados Los metadatosExif
para cualquier formato de imagen personalizada.
Marca de indexación de dispositivos de almacenamiento. MediaProvider indexa todos los volúmenes que se muestran. antes del
StorageManager.getStorageVolumes()
, dondeStorageVolume.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 pila de MTP. Android 11 coloca el MTP completamente fuera de los límites del módulo y garantiza que funcione 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 AndroidPara 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