我正在尝试获取MP3文件的专辑封面。我认为最好和最干净的方法是使用mediametadataretriver类。但由于某些原因,调用getEmbeddedPicture方法不起作用。图像没有显示,LogCat显示一个错误:
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的设备上运行它,所以mediametadataretriiever(需要api等级10)应该没有任何问题。我测试的文件在Windows资源管理器中显示了一张图像,因此似乎嵌入了艺术。有人对此有什么看法吗?
并非所有MP3文件都嵌入了专辑封面,有些专辑的专辑封面是放在专辑文件夹内的,所以你可以看到文件夹内所有文件的专辑封面,
,
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(mp3_file_path);
如果专辑封面嵌入在该文件中,则将获得专辑封面,因此,为未嵌入专辑封面的文件设置默认图像作为专辑封面,并检查返回的byte[]是否为空,
如果byte[]不为空则检索专辑封面,如果为空则设置默认专辑封面图像
在我的项目中,我使用这个
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));
}
我希望这对你有帮助
我得到同样的问题,似乎不是所有的mp3文件有专辑艺术。我们应该做的是为Image设置一个默认图片。
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;
}