Das Artwork für Media-Elemente muss als lokaler URI über ContentResolver.SCHEME_CONTENT
oder ContentResolver.SCHEME_ANDROID_RESOURCE
übergeben werden. Dieser lokale URI muss entweder zu einer Bitmap oder einem Vektordrawable aufgelöst werden.
Übergeben Sie für
MediaDescriptionCompat
-Objekte, die Elemente in der Inhaltshierarchie darstellen, den URI übersetIconUri
.Verwenden Sie für
MediaMetadataCompat
-Objekte, die das wiedergegebene Element darstellen, einen dieser Schlüssel, um den URI überputString
zu übergeben:
Artwork aus den Ressourcen Ihrer App bereitstellen
Wenn Sie Drawables aus den Ressourcen Ihrer App bereitstellen möchten, übergeben Sie einen URI im folgenden Format:
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
In diesem Snippet wird gezeigt, wie Sie einen URI dieses Formats aus einer Ressourcen-ID erstellen:
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()
Artwork über einen Contentanbieter bereitstellen
In diesen Schritten wird beschrieben, wie Sie Grafiken von einem Web-URI herunterladen und über einen lokalen URI mithilfe eines Contentanbieters bereitstellen. Ein vollständiges Beispiel finden Sie in der Implementierung von openFile
und den umgebenden Methoden in der Universal Android Music Player-Beispiel-App.
Erstellen Sie einen
content://
-URI, der dem Web-URI entspricht. Der Media Browser-Dienst und die Media-Sitzung übergeben diesen Inhalts-URI an Android Auto und 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(); }
Prüfen Sie in Ihrer Implementierung von
ContentProvider.openFile
, ob eine Datei für den entsprechenden URI vorhanden ist. Falls nicht, laden Sie die Bilddatei herunter und speichern Sie sie im Cache. In diesem Code-Snippet wird Glide verwendet.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); }