简体   繁体   中英

load cover audio art in android

I want to load cover audio art in android for show list of audio from device. For this purpose i used this following Link:

Like following picture:

在此处输入图片说明

And my code for Load audio files :


  private void loadAudio() {
        ContentResolver contentResolver = getContentResolver();

        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
        String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
        Cursor cursor = contentResolver.query(uri, null, selection, null, sortOrder);
        
        if (cursor != null && cursor.getCount() > 0) {
            audioList.clear();
            while (cursor.moveToNext()) {
                String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                int albumId = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));

                Cursor cursor1 = contentResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
                        new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
                        MediaStore.Audio.Albums._ID + "=" + albumId, null, null);

                Bitmap bitmap = null;
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
                    try {
                        bitmap = contentResolver.loadThumbnail(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, new Size(30, 30), null);

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                String albumArt = "";
                if (cursor1 != null && cursor1.getCount() > 0)
                    while (cursor1.moveToNext()) {
                        albumArt = cursor.getString(cursor1.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
                    }

                // Save to audioList
                audioList.add(new Audio(data, title, album, artist, albumArt, bitmap));
            }
        }
        cursor.close();

        setAdapter();
    }

And in MyAdapter about recyclerview:

 @Override
    public void onBindViewHolder(@NonNull MainHolder holder, int position) {
        Audio audio = arrayList.get(position);
        holder.txtTitle.setText("Title: " + audio.getTitle());
        holder.txtAlbum.setText("Album: " + audio.getAlbum());
        holder.txtArtist.setText("Artist: " + audio.getArtist());
        File imgFile = new File(audio.getAlbumArt());
        Picasso.get().load(imgFile.getAbsolutePath()).into(holder.img);
        if (imgFile.exists()) {
            Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
            holder.img.setImageBitmap(myBitmap);
        }
    }

Help me please.

Solved:

  • Load audio file:
 private void loadAudio() {
        ContentResolver contentResolver = getContentResolver();

        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
        String sortOrder = MediaStore.Audio.Media.ARTIST + " DESC";
        Cursor cursor = contentResolver.query(uri, null, selection, null, sortOrder);

        if (cursor != null && cursor.getCount() > 0) {
            audioList.clear();
            while (cursor.moveToNext()) {
                Audio audio = new Audio();
                String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                int albumId = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
                Bitmap thumbnail = null;
                String albumArt = null;
                Uri imageUri_t;

                Cursor cursor1 = contentResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
                        new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
                        MediaStore.Audio.Albums._ID + "=" + albumId, null, null);

                while (cursor1.moveToNext()) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                        Size thumbSize = new Size(100, 100);
                        try {
                            int thumbColumn = cursor1.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID);
                            int _thumpId = cursor1.getInt(thumbColumn);
                            imageUri_t = ContentUris.withAppendedId(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, _thumpId);
                            thumbnail = getContentResolver().loadThumbnail(imageUri_t, thumbSize, null);

                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    } else {
                        albumArt = cursor1.getString(cursor1.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
                    }
                }


                audio.setData(data);
                audio.setTitle(title);
                audio.setAlbum(album);
                audio.setArtist(artist);
                audio.setAlbumId(albumId);
                audio.setAlbumArt(albumArt);
                audio.setThumbnail(thumbnail);
                audioList.add(audio);
            }
        }
        cursor.close();

        setAdapter();
    }
  • And a part of MyAdapter:
@Override
    public void onBindViewHolder(@NonNull MainHolder holder, int position) {
        Audio audio = arrayList.get(position);
        holder.txtTitle.setText("Title: " + audio.getTitle());
        holder.txtAlbum.setText("Album: " + audio.getAlbum());
        holder.txtArtist.setText("Artist: " + audio.getArtist());

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            if (audio.getThumbnail() != null)
            holder.img.setImageBitmap(audio.getThumbnail());
        } else {
            if (audio.getAlbumArt() != null) {
                File imgFile = new File(audio.getAlbumArt());
                if (imgFile.exists()) {
                    Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
                    holder.img.setImageBitmap(myBitmap);
                }
            }
        }
    }

First query on MediaStore.Audio.Media.ARTIST about fetch audio info from MediaStore.

There is a difference About fetch thumbnail of Audio file in android 10 (Q) and below. So query for lower than Android 10 is like follow:

String albumArt = cursor1.getString(cursor1.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));

You can get album art from ALBUM_ART column in MediaStore.Audio.Albums .

Then for Android 10 like follow this:

Query on MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI where albumId equals _ID column from MediaStore.Audio.Albums . And load thumbnail from Content Resolver by image uri...

I hope it is useful ;)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM