我正在尝试制作一个简单的应用程序,向我显示专辑列表,而我在下面的代码中苦苦挣扎:
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可以帮助我解决问题。
祝你好运! (如果您需要我的建议,我会在这里...)