Check if album art exists?

可紊 提交于 2019-12-11 00:25:12

问题


I'm building a music player app. I'm trying to populate a recyclerView with album arts of songs. I successfully did that with the code that is given below. But some of the songs do not have embedded album art not any album art in the folder. So, I'm trying to check if the album art is null or not before adding it to the recyclerView. If the album art is null, the app will automatically fetch it from the internet. I tried checking if the album art is null or not, but everytime it gives me a uri whether the album art is available or not.

Code for fetching album art from 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());
        }

The value for albumArtUri is never null.

It always gives the following uri(s):

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

But among these uri(s), content://media/external/audio/albumart/9 has no album art. It always displays the placeholder I said using Glide

So my question, how to check if album art is available(as embedded art or in song folder) before populating the recyclerView? I know I can use Glide placeholder and I'm using it. But I also want to fetch album art from the internet if album art is not available offline, that is why I need to check, so that I can add the internet links into the arraylist. Hope you guys get what I'm trying to say.

Thank you!

EDIT:

I found that the below given code snippet returns if album art exists or not but it consumes a lot of time.

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

回答1:


The easiest way:

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

and

  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;

}




回答2:


you can check for album cover by using the MediaMetadataRetriever try the code below and also read the 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
}


来源:https://stackoverflow.com/questions/50423453/check-if-album-art-exists

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!