Le copertine degli elementi multimediali devono essere trasmesse come URI locale utilizzando ContentResolver.SCHEME_CONTENT
o ContentResolver.SCHEME_ANDROID_RESOURCE
. Questo URI locale deve essere risolto in
un bitmap o un elemento di disegnabile vettoriale.
Per gli oggetti
MediaDescriptionCompat
che rappresentano elementi nella gerarchia dei contenuti, trasmetti l'URI tramitesetIconUri
.Per gli oggetti
MediaMetadataCompat
che rappresentano l'elemento in riproduzione, utilizza una di queste chiavi per passare l'URI tramiteputString
:
Fornisci artwork dalle risorse della tua app
Per fornire risorse grafiche dalle risorse dell'app, passa un URI nel seguente formato:
android.resource://PACKAGE_NAME/RESOURCE_TYPE/RESOURCE_NAME
// Example URI - note that there is no file extension at the end of the URI
android.resource://com.example.app/drawable/example_drawable
Questo snippet mostra come creare un URI di questo formato da un ID risorsa:
val resources = context.resources
val resourceId: Int = R.drawable.example_drawable
Uri.Builder()
.scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
.authority(resources.getResourcePackageName(resourceId))
.appendPath(resources.getResourceTypeName(resourceId))
.appendPath(resources.getResourceEntryName(resourceId))
.build()
Fornire artwork utilizzando un fornitore di contenuti
Questi passaggi descrivono come scaricare la copertina da un URI web ed esporla tramite un URI locale utilizzando un content provider. Per un esempio completo, consulta l'implementazione di openFile
e i metodi circostanti nell'app di esempio Universal Android Music Player.
Crea un URI
content://
corrispondente all'URI web. Il servizio di esplorazione dei contenuti multimediali e la sessione multimediale passano questo URI contenuto ad Android Auto e 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(); }
Nell'implementazione di
ContentProvider.openFile
, controlla se esiste un file per l'URI corrispondente. In caso contrario, scarica e memorizza nella cache il file immagine. Questo snippet di codice utilizza 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); }