我正在构建一个音乐播放器应用。我试图用歌曲的专辑艺术填充recyclerView
。我用下面给出的代码成功地做到了这一点。但有些歌曲没有嵌入专辑封面,也没有任何专辑封面。所以,在将专辑封面添加到recyclerView
之前,我试图检查专辑封面是否为空。如果专辑封面为空,则应用程序将自动从互联网上获取它。我尝试检查相册艺术是否为空,但每次它给我一个uri
是否可用专辑封面。
从mediastore获取专辑封面的代码:
String[] projection = {MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.ALBUM_ID};
Cursor cursor = getActivity().getContentResolver().query(uri, projection, selection, whereVal, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
do {
long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID));
String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
Long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
Long albumId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
String albumArtUri = String.valueOf(ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"),albumId));
SongInfoModel s = new SongInfoModel(id, name, artist, null, album, null, duration, data, albumId,albumArtUri);
SongList.add(s);
} while (cursor.moveToNext());
}
albumArtUri的值永远不会为空。
它总是提供以下uri:
content://media/external/audio/albumart/12
content://media/external/audio/albumart/5
content://media/external/audio/albumart/6
content://media/external/audio/albumart/3
content://media/external/audio/albumart/8
content://media/external/audio/albumart/9
但在这些uri(s)中,content://media/external/audio/albumart/9
没有专辑封面。它始终使用Glide
所以我的问题是,如何在填充recyclerView
之前检查专辑封面是否可用(作为嵌入式艺术或歌曲文件夹)?我知道我可以使用Glide
占位符并且我使用它。但是如果专辑封面不能离线,我也想从互联网上获取专辑封面,这就是我需要检查的原因,这样我就可以将互联网链接添加到arraylist中。希望你们能得到我想说的话。
谢谢!
修改:
我发现如果专辑封面存在或不存在,下面给出的代码片段会返回但是它会花费很多时间。
public String fetchAlbumArt(long albumID){
String art;
Cursor cur = getActivity().getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, new String[]
{MediaStore.Audio.Albums.ALBUM_ART}, MediaStore.Audio.Albums._ID + "=?", new String[] {String.valueOf(albumID)}, null);
cur.moveToFirst();
art = cur.getString(cur.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
cur.close();
return art;
}
答案 0 :(得分:1)
最简单的方法:
// loading album cover using Glide library
String stralbumId = c.getString(c
.getColumnIndex(BaseColumns._ID));
Uri ImageUrl = getAlbumUri(mContext, stralbumId);
if (ImageUrl != null) {
Glide.with(mContext)
.asBitmap()
.load(ImageUrl)
.into(image);
}
和
public Uri getAlbumUri(Context mContext,String album_id){
if(mContext!=null) {
Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
Uri imageUri = Uri.withAppendedPath(sArtworkUri, String.valueOf(album_id));
return imageUri;
}
return null;
}
答案 1 :(得分:0)
您可以使用MediaMetadataRetriever
检查专辑封面
尝试下面的代码,并阅读MediaMetadataRetriever
Documentation
MediaMetadataRetriever retriver = new MediaMetadataRetriever();
retriver.setDataSource(musicFile.getAbsolutePath());
byte[] cover = retriver.getEmbeddedPicture();
if(cover == null){
// get cover from the internet
}else{
// use glide to load the album art
}