Ich schreibe gerade eine UPnP-Fernsteuerungs-App, mit der ein entfernter MediaServer mit einem entfernten MediaRenderer verbunden wird. Da die eigentlichen MP3-Dateien nicht an das Android-Gerät gesendet werden, möchte ich das Albumcover der aktuell abgespielten Datei abrufen können, ohne die gesamte MP3-Datei auf mein Telefon herunterladen zu müssen.Ist es möglich, Albumcover von einer Remote-MP3-Datei in Android abzurufen?
Ich habe gelesen, dass MediaMetadataRetriever
ist nützlich für diese Art von Sache, aber ich habe es nicht geschafft zu arbeiten. Bei jeder Art, wie ich es versuche, erhalte ich durch den Aufruf an MediaMetadataRetriever#setDataSource
eine IllegalArgumentException
, die angibt, dass meine Dateikennung oder URI ungültig ist.
MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
folgende Arbeiten, da es auf dem Gerät ein direkter Dateipfad ist selbst:
metaRetriever.setDataSource("/sdcard/Music/Daft_Punk/Homework/01 - Daftendirekt.mp3");
jedoch eine des folgenden Aktionen mit dem gleichen Fehler fehlschlagen:
metaRetriever.setDataSource(appCtx, Uri.parse("http://192.168.1.144:49153/content/media/object_id/94785/res_id/1/rct/aa"));
metaRetriever.setDataSource(appCtx, Uri.parse("http://192.168.1.144:49153/content/media/object_id/94785/res_id/0/ext/file.mp3"));
metaRetriever.setDataSource("http://192.168.1.144:49153/content/media/object_id/94785/res_id/0/ext/file.mp3");
Die erste ist das AlbumArtURI aus den UPnP-Metadaten (keine * .mp3-Erweiterung, aber die Datei wird heruntergeladen, wenn in einen Webbrowser eingefügt).
Der zweite und dritte Versuch verwenden den Wert "res" aus den UPnP-Metadaten, der auf die tatsächliche Datei auf dem Server verweist.
Ich hoffe, dass ich nur die URI falsch analysieren, aber ich habe keine Ideen mehr.
Irgendwelche Vorschläge? Gibt es auch einen besseren Weg, dies vollständig zu tun, wenn Sie von einem UPnP-Server ziehen? FWIW, ich benutze die Cling UPnP-Bibliothek.
== Lösung ==
Ich begann Antwort William-seemann sucht in und führte mich dazu: MediaMetadataRetriever.setDataSource(String path) no longer accepts URLs
Kommentar # 2 zu diesem Beitrag erwähnt eine andere Version von setDataSource()
verwenden, die noch in weiter Ferne akzeptiert URLs.
Hier ist, was ich tun endete und es funktioniert super:
private Bitmap downloadBitmap(final String url) {
final MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
metaRetriever.setDataSource(url, new HashMap<String, String>());
try {
final byte[] art = metaRetriever.getEmbeddedPicture();
return BitmapFactory.decodeByteArray(art, 0, art.length);
} catch (Exception e) {
Logger.e(LOGTAG, "Couldn't create album art: " + e.getMessage());
return BitmapFactory.decodeResource(getResources(), R.drawable.album_art_missing);
}
}
Es stellt sich heraus Sie die HashMap für Remote-URLS passieren müssen, meine Tags zurückgegeben null, aber zumindest hörte es mit Illegal Absturz jetzt. – kabuto178