2013-04-29 18 views
5

Ich versuche, das Albumcover einer MP3-Datei zu bekommen. Ich dachte, der beste und sauberste Weg wäre die MediaMetadataRetriever-Klasse. Aber aus irgendeinem Grund funktioniert der Aufruf der getEmbeddedPicture-Methode nicht. Das Bild zeigt nicht, LogCat zeigt einen Fehler:Get eingebettete MP3-Datei eingebettete Kunst fehlgeschlagen

04-29 18:36:19.520: E/MediaMetadataRetrieverJNI(25661): getEmbeddedPicture: Call to getEmbeddedPicture failed. 

Dies ist der Code, der nicht zu funktionieren scheint:

@Override 
    protected Void doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     MediaMetadataRetriever mmdr = new MediaMetadataRetriever(); 
     mmdr.setDataSource(path); //path of the MP3 file on SD Card 
     bites = mmdr.getEmbeddedPicture(); 
     if(bites != null) 
     artBM = BitmapFactory.decodeByteArray(bites, 0, bites.length); 
     return null; 
    } 

Ich laufe es auf einem Gerät mit Android 4.2, Es sollte also kein Problem mit dem MediaMetadataRetriever geben (erfordert API-Level 10). Die Dateien, die ich getestet habe, zeigen ein Bild im Windows Explorer an, also scheint es Kunst zu geben. Hat jemand darüber irgendwelche Gedanken?

+0

Lokal, aber es scheint, dass es von der Datei abhängt. Bei anderen MP3-Dateien zeigt es das Albumcover. –

Antwort

7

Nicht alle MP3-Dateien haben Albumcover eingebettet ist, für einige Alben des Albumcover in dem Albumordner platziert ist, so dass Sie das Albumcover für alle Dateien in diesem Ordner sehen können,

Aber

MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 
mmr.setDataSource(mp3_file_path); 

Dadurch wird das Albumcover angezeigt, wenn das Albumcover in diese Datei eingebettet ist. Erstellen Sie daher ein Standardbild als Albumcover für Dateien, die nicht in Albumcover eingebettet sind. Überprüfen Sie, ob das zurückgegebene Byte [] null ist oder nicht,

Wenn das Byte [] nicht null ist, dann Album art abgerufen, wenn es null dann das Standard-Albumcover Bild

In meinem Projekt Im mit diesen

MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 
    mmr.setDataSource(songsList.get(index).get("songPath")); 
    byte[] artBytes = mmr.getEmbeddedPicture(); 
    if(artBytes != null) 
    { 
     InputStream is = new ByteArrayInputStream(mmr.getEmbeddedPicture()); 
     Bitmap bm = BitmapFactory.decodeStream(is); 
     imgArt.setImageBitmap(bm); 
    } 
    else 
    { 
     imgArt.setImageDrawable(getResources().getDrawable(R.drawable.adele)); 
    } 

Hoffnung gesetzt ist ich das Sie

0

ich das gleiche Problem helfen wird, scheint es, dass Nicht jede mp3-Datei hat ein Albumcover. Was wir tun sollten, ist ein Standardbild für das Bild festzulegen.

public Bitmap getAlbumBitmap(Context context, String url, int defaultRes) { 
     Bitmap bitmap = null; 
     //能够获取多媒体文件元数据的类 
     MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
     try { 
      retriever.setDataSource(url); //设置数据源 
      byte[] embedPic = retriever.getEmbeddedPicture(); //得到字节型数据 
      bitmap = BitmapFactory.decodeByteArray(embedPic, 0, embedPic.length); //转换为图片 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       retriever.release(); 
      } catch (Exception e2) { 
       e2.printStackTrace(); 
      } 
     } 
     return bitmap == null ? BitmapFactory.decodeResource(context.getResources(), defaultRes) : bitmap; 
    }