我正在尝试制作一个简单的应用程序,向我显示专辑列表,而我在下面的代码中苦苦挣扎:

mmr.setDataSource(a.getSong(i).getPath());


这是一个函数的“越野车”部分,该部分假定将一个位图图像添加到Song对象的位图值上(如下所示。)
现在由于一个未知的原因,当文件没有专辑封面时,我得到(如标题上所述)“调用getEmbeddedPicture失败。”例外。

现在,我尝试了多种方法将此位图添加到Song对象中-包括使用Glide,Media.Audio.Album.ALBUM_ART,以及我可以在Internet上找到的所有其他方法。

当前,我正在使用使用解码流的方法(来自BitmapFactory库)

    void setCover (int index){
        for (int i = 0; i < lstAlbums.get(index).getAmountOfTracks(); i++) {
            Album a = lstAlbums.get(index);
            MediaMetadataRetriever mmr = new MediaMetadataRetriever();
            try {
                mmr.setDataSource(a.getSong(i).getPath());
                byte[] artBytes = mmr.getEmbeddedPicture();
                if (artBytes != null) {
                    InputStream is = new ByteArrayInputStream(mmr.getEmbeddedPicture());
                    Bitmap bm = BitmapFactory.decodeStream(is);
                    a.getSong(i).setCover(bm);
                } else {
                    //a.getSong(i).setCover(getResources().getDrawable(R.drawable.your_default_image));
                }
            } catch (Exception e) {

            }
        }
    }


我所知道的是,当我为没有封面的歌曲调用“ mmr.getEmbeddedPicture()”时,我只会得到简单的“ null”值。
我100%确信它与“ getPath()”返回的值无关,因为当我有一首带有专辑封面的歌曲时,该函数可以完美地工作。

最佳答案

我修好了它!
错误的是道路。大声笑。
我完全更改了代码。

我需要它位于CardView上,因此在RecycleViewAdapter.java文件中,我编写了以下代码:

Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
/*getAlbumId gives you the ID of the album
*(provided by - long albumId = songCursor.getLong(songCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
*/
Uri imgUri = ContentUris.withAppendedId(sArtworkUri, albumList.get(position).getAlbumId());

Glide.with(mContext)
        .load(imgUri)
        .apply(requestOptions)
        .into(holder.img_album_cover);


onBindViewHolder()上无效。

mContext is - Context mContext object //provided from RecyclerViewAdapter object)

requestOptions is - RequestOptions requestOptions = new RequestOptions().placeholder(R.drawable.ic_launcher_background);
//Which is a part of the Glide library.

holder.img_album_cover //is - the ImageView in which I'm going to insert the image.


如果有人需要帮助,this great video可以帮助我解决问题。

祝你好运! (如果您需要我的建议,我会在这里...)

10-08 14:15