6

我正在尝试获取 MP3 文件的专辑封面。我认为最好和最干净的方法是使用 MediaMetadataRetriever 类。但是由于某种原因调用 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 的设备上运行它,所以 MediaMetadataRetriever 应该没有任何问题(需要 api lvl 10)。我测试的文件在 Windows 资源管理器中显示图像,因此似乎嵌入了艺术。有人对此有任何想法吗?

4

2 回答 2

9

并非所有 MP3 文件都嵌入了专辑封面,对于某些专辑,专辑封面位于专辑文件夹中,因此您可以查看该文件夹中所有文件的专辑封面,

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

如果专辑封面嵌入在该文件中,这将获取专辑封面,因此为未嵌入专辑封面的文件制作默认图像作为专辑封面,并检查返回的字节 [] 是否为空,

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

我希望这能帮到您

于 2013-07-17T10:04:04.713 回答
0

我遇到了同样的问题,似乎并非所有 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;
    }
于 2017-02-25T17:14:30.147 回答