2013-04-29 103 views
5

我正在嘗試獲取MP3文件的專輯封面。我認爲最好和最乾淨的方法是使用MediaMetadataRetriever類。但由於某種原因調用getEmbeddedPicture方法不起作用。圖像不顯示,logcat中顯示了一個錯誤:獲取嵌入式mp3文件嵌入式藝術失敗

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

這似乎不工作代碼:

@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; 
    } 

我與Android 4.2上運行它的設備上,因此MediaMetadataRetriever不應該有任何問題(需要api lvl 10)。我測試的文件在Windows資源管理器中顯示圖像,所以似乎嵌入了藝術。任何人對此有任何想法?

+0

本地,但它似乎取決於該文件。在其他MP3文件中,它確實顯示專輯封面。 – 2013-04-30 23:09:53

回答

7

並非所有的MP3文件已經專輯封面嵌入式,對某些唱片專輯封面放在相冊文件夾內,所以你可以看到專輯封面的文件夾內的所有文件,

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

如果相冊藝術被嵌入到該文件中,這將獲得相冊藝術,因此,將默認圖像設置爲未使用相冊藝術嵌入的文件的相冊藝術,並檢查返回的字節[]是否爲空,

如果byte []不爲空,那麼專輯封面被檢索到,如果它爲null,則使用此

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)); 
    } 

我希望這將有助於你

0

我得到了同樣的問題設置默認的專輯封面圖片

在我的項目IM,似乎並非所有的mp3文件都有專輯封面。我們應該做的是將默認圖片設置爲圖像。

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; 
    }