Как отобразить обложку альбома с помощью MediaStore.Audio.Albums.ALBUM_ART?

Я пытаюсь создать MP3-плеер и хочу, чтобы ImageView отображал обложку альбома соответствующих песен. Я пробовал следующее, но это не работает.

albumcover = (ImageView) findViewById(R.id.cover);

String coverPath = songsList.get(songIndex).get(MediaStore.Audio.Albums.ALBUM_ART);
Drawable img = Drawable.createFromPath(coverPath);
albumcover.setImageDrawable(img);

Когда я пытаюсь воспроизвести песни, все, что я получаю, это пустой экран в ImageView.


person max59    schedule 10.07.2013    source источник
comment
также см. stackoverflow.com/a/28624058/3496570 и stackoverflow.com/a/28624084/3496570   -  person AndroidGeek    schedule 20.02.2015


Ответы (7)


Вот как я получаю обложку альбома для песни:

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

if (cursor.moveToFirst()) {
    String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
    // do whatever you need to do
}

albumId относится к MediaStore.Audio.Media.ALBUM_ID этой песни.

Если вы ищете обложку альбома для конкретной песни (а не в списке альбомов), насколько мне известно, это двухэтапный процесс, поскольку ALBUM_ART является свойством MediaStore.Audio.Albums и недоступен непосредственно как метаданные песни.

person Ken Wolf    schedule 10.07.2013
comment
Что делать со строкой после ее получения? Как я могу преобразовать uri в растровое изображение? - person Ankit Srivastava; 20.11.2013
comment
@AnkitSrivastava строка — это путь к изображению обложки альбома, поэтому вы можете превратить его в растровое изображение, например, используя BitmapFactory.decodeFile(String path) - person Ken Wolf; 21.11.2013
comment
я пробовал, можете ли вы помочь мне с вопросом ?? /а> - person Ankit Srivastava; 21.11.2013
comment
@KenWolf, вы упомянули, что получение изображений для конкретной песни — это двухэтапный процесс. не могли бы вы немного рассказать об этом, мне действительно нужно было помочь с этим. - person Prashant Patel; 11.04.2014
comment
@PrashantPatel на двух этапах Я просто имею в виду, насколько мне известно, вы не можете напрямую получить обложку альбома из песни, это свойство альбома. Итак, сначала вы должны получить альбом, к которому принадлежит песня, а затем вы получите обложку. - person Ken Wolf; 11.04.2014
comment
@KenWolf Да, вы правы, мне удалось сделать это с помощью Metadataretriver, но я хотел знать, возможен ли другой способ. Спасибо за ответ. - person Prashant Patel; 11.04.2014
comment
@PrashantPatel Для дальнейшего использования: MediaStore.Audio.AlbumColumns и таблица MediaStore.Audio.AudioColumns связан с ключом ALBUM_ID - person the_prole; 15.10.2015
comment
@KenWolf Слишком поздно, но есть способ это Но как работает? - person Neelay Srivastava; 10.08.2016
comment
Этот метод может вызвать проблемы на Android 10, поскольку путь недоступен (ошибка EACCESS). предоставления разрешения (чтение и запись для External_Storage) будет недостаточно. - person AndrewBloom; 22.10.2019

Если у вас есть идентификатор альбома, вы получите uri изображения альбома:-

final public static Uri sArtworkUri = Uri
            .parse("content://media/external/audio/albumart");      

Uri uri = ContentUris.withAppendedId(PlayerConstants.sArtworkUri,
                listOfAlbums.get(position).getAlbumID());

Если у вас есть URI изображения, вы можете использовать любой из загрузчиков изображений Glide. , Picaso, UIL для отображения изображений .

                               **OR**

вы можете написать свой собственный загрузчик изображений

public Bitmap getAlbumart(Context context, Long album_id) {
    Bitmap albumArtBitMap = null;
    BitmapFactory.Options options = new BitmapFactory.Options();
    try {

        final Uri sArtworkUri = Uri
                .parse("content://media/external/audio/albumart");

        Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);

        ParcelFileDescriptor pfd = context.getContentResolver()
                .openFileDescriptor(uri, "r");

        if (pfd != null) {
            FileDescriptor fd = pfd.getFileDescriptor();
            albumArtBitMap = BitmapFactory.decodeFileDescriptor(fd, null,
                    options);
            pfd = null;
            fd = null;
        }
    } catch (Error ee) {
    } catch (Exception e) {
    }

    if (null != albumArtBitMap) {
        return albumArtBitMap;
    }
    return getDefaultAlbumArtEfficiently(context.getResources());
}



public Bitmap getDefaultAlbumArtEfficiently(Resources resource) {

    if (defaultBitmapArt == null) {

        defaultBitmapArt = decodeSampledBitmapFromResource(resource,
                R.drawable.default_album_art, UtilFunctions
                        .getUtilFunctions().dpToPixels(85, resource),
                UtilFunctions.getUtilFunctions().dpToPixels(85, resource));

    }
    return defaultBitmapArt;
}
person Hitesh Sahu    schedule 17.01.2016
comment
Не забудьте вызвать fd.close() (BitmapFactory.decodeFileDescriptor этого тоже не делает) - person Robin Davies; 28.01.2020

Этот метод возвращает ArrayList с путем к песне и обложкой альбома.

public static ArrayList<CommonModel> getAllMusicPathList(Context context) {
    ArrayList<CommonModel> musicPathArrList = new ArrayList<>();
    Uri songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

    Cursor cursorAudio = context.getContentResolver().query(songUri, null, null, null, null);
    if (cursorAudio != null && cursorAudio.moveToFirst()) {

        Cursor cursorAlbum;
        if (cursorAudio != null && cursorAudio.moveToFirst()) {

            do {
                Long albumId = Long.valueOf(cursorAudio.getString(cursorAudio.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)));
                cursorAlbum = context.getContentResolver().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);

                    if(cursorAlbum != null && cursorAlbum.moveToFirst()){
                        String albumCoverPath = cursorAlbum.getString(cursorAlbum.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
                        String data = cursorAudio.getString(cursorAudio.getColumnIndex(MediaStore.Audio.Media.DATA));
                        musicPathArrList.add(new CommonModel(data,albumCoverPath ,false));
                    }

                 } while (cursorAudio.moveToNext());
        }
    }
    return musicPathArrList;
}

это CommonModel.

public class CommonModel {

private String path;
private boolean selected;

public String getAlbumCoverPath() {
    return albumCoverPath;
}

public void setAlbumCoverPath(String albumCoverPath) {
    this.albumCoverPath = albumCoverPath;
}

private String albumCoverPath;

public CommonModel(String path, String albumCoverPath, boolean b) {
    this.path = path;
    this.albumCoverPath=albumCoverPath;
    this.selected=b;
}

public String getPath() {
    return path;
}

public void setPath(String path) {
    this.path = path;
}

public boolean getSelected() {
    return selected;
}

public void setSelected(boolean selected) {
    selected = selected;
}
}
person Kuldeep mourya    schedule 21.12.2017

Вы должны использовать Uri.parse("content://media/external/audio/albumart"); чтобы запросить обложку альбома. 1-й ответ может получить исключение на каком-то телефоне (по крайней мере, на моем)

person Shaw    schedule 24.04.2015

Код ниже работал для меня. Я знаю, что на него уже был дан ответ, это может быть полезно для тех, кто проверяет ссылку.

 public void getAlbumArt() {
    try {
        ContentResolver cr = getContentResolver();
        Uri uri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;

        Cursor cursor = cr.query(uri, null, null, null, null);

        if (cursor != null && cursor.moveToFirst()) {
            int albumart = cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART);
            do {
                String Albumids = cursor.getString(albumart);
                Albumid.add(Albumids);

            } while (cursor.moveToNext());
        }cursor.close();
    } catch (NumberFormatException e){
        e.printStackTrace();
    }
}
public void getSelectedPath(){
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            String path= String.valueOf(listView.getItemAtPosition(i));

                if(path.equals("null")){
                ImageView imgv=(ImageView)view.findViewById(R.id.imageView);
                imgv.setImageResource(R.drawable.unknowalbum);
                imgv.setMaxHeight(50);
                imgv.setMaxWidth(50);

            }
            else{
                Drawable image=Drawable.createFromPath(path);
                ImageView imgview=(ImageView)view.findViewById(R.id.imageView);
                imgview.setImageDrawable(image);

            }
        }
    });
}

для полного кода посетите http://vasistaguru.blogspot.com/2017/02/get-albumart-and-trackname-using.html

person Gopalakrishna Umapathi    schedule 17.02.2017

Пример кода

public static Uri getAlbumArtUri(long albumId) {
    return ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), albumId);
}


ArrayList<Uri> albumArtUris = new ArrayList<>();
Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{"album_id"}, null, null, null);
cursor.moveToFirst();
do {
    long ablumId = cursor.getLong(cursor.getColumnIndexOrThrow("album_id"));
    albumArtUris.add(getAlbumArtUri(ablumId));
} while (cursor.moveToNext());
person shellhub    schedule 16.10.2018

person    schedule
comment
ответ, данный Кеном, также правильный, но, как новичок, мне нужно потратить много времени, чтобы заставить его работать. Вот почему я загрузил полный ответ. - person Kishan Kumar; 10.08.2016