我正在构建一个音乐播放器应用程序。我正在尝试用歌曲的专辑封面填充recyclerView。我使用下面给出的代码成功做到了这一点。但是某些歌曲在文件夹中没有嵌入专辑封面,也没有任何专辑封面。因此,我尝试在将专辑封面添加到recyclerView之前检查专辑封面是否为空。如果专辑封面为空,则应用程序将自动从互联网上获取专辑封面。我尝试检查专辑封面是否为空,但是每次它给我一个uri专辑封面是否可用。

从媒体商店获取专辑封面的代码:

 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的值永远不会为null。

它始终提供以下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中,content://media/external/audio/albumart/9没有专辑封面。它总是显示我使用Glide所说的占位符

因此,我的问题是,在填充recyclerView之前如何检查专辑封面是否可用(作为嵌入作品还是在歌曲文件夹中)?我知道我可以使用Glide占位符,并且正在使用它。但是,如果专辑封面无法脱机使用,我还想从互联网上获取专辑封面,这就是为什么我需要检查以便将互联网链接添加到数组列表中的原因。希望你们能明白我的意思。

谢谢!

编辑:

我发现以下给定的代码片段是否存在专辑封面会返回,但会占用大量时间。

  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;
}

最佳答案

最简单的方法:

                //  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;


}

08-25 23:20