获取嵌入式mp3文件嵌入式艺术失败

Ray*_*d P 5 mp3 android albumart

我正试图获得MP3文件的专辑封面.我认为最好和最干净的方法是使用MediaMetadataRetriever类.但由于某些原因调用getEmbeddedPicture方法不起作用.图像未显示,LogCat显示错误:

04-29 18:36:19.520: E/MediaMetadataRetrieverJNI(25661): getEmbeddedPicture: Call to getEmbeddedPicture failed.
Run Code Online (Sandbox Code Playgroud)

这是似乎不起作用的代码:

    @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;
    }
Run Code Online (Sandbox Code Playgroud)

我在Android 4.2的设备上运行它,因此MediaMetadataRetriever应该没有任何问题(需要api lvl 10).我测试的文件在Windows资源管理器中显示了一个图像,所以似乎嵌入了艺术.有没有人对此有任何想法?

Man*_*ani 7

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

MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(mp3_file_path); 
Run Code Online (Sandbox Code Playgroud)

如果相册艺术嵌入在该文件中,这将获得相册艺术,因此,对于未嵌入相册艺术的文件,将默认图像作为专辑封面,并检查返回的byte []是否为空,

如果byte []不为null,则检索Album art,如果为null,则设置默认的专辑封面图像

在我的Project Im中使用它

    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));
    }
Run Code Online (Sandbox Code Playgroud)

我希望这能帮到您