El material gráfico de los elementos multimedia se debe pasar como un URI local con ContentResolver.SCHEME_CONTENT
o ContentResolver.SCHEME_ANDROID_RESOURCE
. Este URI local debe resolverse como un mapa de bits o un elemento de diseño vectorial en los recursos de la aplicación. Para los objetos MediaDescriptionCompat
que representan elementos de la jerarquía de contenido, pasa el URI a través de setIconUri
.
Para los objetos MediaMetadataCompat
que representan el elemento que se está reproduciendo, usa cualquiera de estas claves para pasar el URI a través de putString
:
MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI
MediaMetadataCompat.METADATA_KEY_ART_URI
MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI
En estos pasos, se describe cómo descargar arte desde un URI web y exponerlo a través de un URI local. Para obtener un ejemplo completo, consulta la implementación de openFile
y los métodos circundantes en la app de ejemplo de Universal Android Music Player.
Compila un URI de
content://
correspondiente al URI web. La sesión y el servicio del navegador multimedia deben pasar este URI de contenido a Android Auto y al SO Android Automotive (AAOS).Kotlin
fun Uri.asAlbumArtContentURI(): Uri { return Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(CONTENT_PROVIDER_AUTHORITY) .appendPath(this.getPath()) // Make sure you trust the URI .build() }
Java
public static Uri asAlbumArtContentURI(Uri webUri) { return new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(CONTENT_PROVIDER_AUTHORITY) .appendPath(webUri.getPath()) // Make sure you trust the URI! .build(); }
En tu implementación de
ContentProvider.openFile
, verifica si existe un archivo para el URI correspondiente. De lo contrario, descarga y almacena en caché el archivo de imagen. En este fragmento de código, se usa Glide.Kotlin
override fun openFile(uri: Uri, mode: String): ParcelFileDescriptor? { val context = this.context ?: return null val file = File(context.cacheDir, uri.path) if (!file.exists()) { val remoteUri = Uri.Builder() .scheme("https") .authority("my-image-site") .appendPath(uri.path) .build() val cacheFile = Glide.with(context) .asFile() .load(remoteUri) .submit() .get(DOWNLOAD_TIMEOUT_SECONDS, TimeUnit.SECONDS) cacheFile.renameTo(file) file = cacheFile } return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY) }
Java
@Nullable @Override public ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode) throws FileNotFoundException { Context context = this.getContext(); File file = new File(context.getCacheDir(), uri.getPath()); if (!file.exists()) { Uri remoteUri = new Uri.Builder() .scheme("https") .authority("my-image-site") .appendPath(uri.getPath()) .build(); File cacheFile = Glide.with(context) .asFile() .load(remoteUri) .submit() .get(DOWNLOAD_TIMEOUT_SECONDS, TimeUnit.SECONDS); cacheFile.renameTo(file); file = cacheFile; } return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); }
Para obtener detalles sobre los proveedores de contenido, consulta Cómo crear un proveedor de contenido.