Как получить обложку альбома? Индекс столбца ALBUM_ART равен -1.

Я хочу альбом каверов на песни в моем телефоне, но я получаю индекс столбца -1

        int imageColumn = musicCursor.getColumnIndex(MediaStore.Audio.AlbumColumns.ALBUM_ART);

Это полный код:

// Retrieve song info from device
public void getSongList() {
    String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";

    // Query external audio
    ContentResolver musicResolver = getActivity().getContentResolver();
    Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Cursor musicCursor = musicResolver.query(musicUri, null, selection, null, null);

    // Iterate over results if valid
    if (musicCursor != null && musicCursor.moveToFirst()) {
        // Get columns
        int titleColumn = musicCursor.getColumnIndex
                (android.provider.MediaStore.Audio.Media.TITLE);
        int idColumn = musicCursor.getColumnIndex
                (android.provider.MediaStore.Audio.Media._ID);
        int artistColumn = musicCursor.getColumnIndex
                (android.provider.MediaStore.Audio.Media.ARTIST);
        int durationColumn = musicCursor.getColumnIndex
                (MediaStore.Audio.Media.DURATION);

        int imageColumn = musicCursor.getColumnIndex
                (MediaStore.Audio.AlbumColumns.ALBUM_ART);
        // ****** HERE I HAVE -1, the same is with MediaStore.Audio.Albums.ALBUM_ART ******


        // Add songs to list
        do {
            long thisId = musicCursor.getLong(idColumn);
            String thisTitle = musicCursor.getString(titleColumn);
            String thisArtist = musicCursor.getString(artistColumn);
            long thisDuration = musicCursor.getLong(durationColumn);

            String thisPathAlbumImage =  musicCursor.getString(imageColumn); 
            // ****** HERE MY APP CRASH FOR -1 INDEX ******

            arrayOfSongs.add(new Song(thisId, thisTitle, thisArtist, thisDuration, thisPathAlbumImage));

            Log.d(LOG_TAG, "New song added: " + thisTitle);
        }
        while (musicCursor.moveToNext());
    }
}

Почему я получаю -1? Я хочу, чтобы каждая обложка альбома устанавливала их в ListView с названием песни, именем исполнителя и продолжительностью.


person Hazlo8    schedule 04.11.2015    source источник
comment
используйте DatabaseUtils.dumpCursor(musicCursor), чтобы увидеть свой Cursor   -  person pskink    schedule 04.11.2015


Ответы (2)


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

person Nawako    schedule 04.11.2015

Используемый вами запрос не возвращает столбец MediaStore.Audio.AlbumColumns.ALBUM_ART. Теперь у вас есть определенные возможности.

  1. Вы можете использовать ответ, предоставленный и связанный @nawako. Но, как напоминает нам этот твит от Яна Лейка, он явно не является частью официального SDK. быть изменены или изменены.
  2. Вы можете использовать запрос, который возвращает столбец. Использование MediaStore.Audio.Albums.EXTERNAL_CONTENT_TYPE позволит получить список альбомов, а также включить MediaStore.Audio.AlbumColumns.ALBUM_ART. Обратите внимание, что эта опция не загружает музыку, для этого вам понадобится отдельный запрос.
  3. Вы можете получить обложку с помощью метода в этом ответе . Это не требует каких-либо изменений вашего текущего запроса.

Вот пример кода, реализующего вариант 2.

Bitmap art;
String path;
Uri artUri;
Uri musicUri = android.provider.MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;

.
.
.

path = musicCursor.getString(imageColumn);

if (path != null) {
    artUri = Uri.fromFile(new File(path));

    try {
         coverArt = MediaStore.Images.Media.getBitmap(musicResolver, artUri);
    } catch (IOException e) {
        // For some reason we have no album art. Assign a default cover?
        e.printStackTrace();
    }
}
person phxhawke    schedule 04.11.2015
comment
Привет, спасибо за ответ... лучше всего номер 2? Есть примеры? Спасибо еще раз :) - person Hazlo8; 04.11.2015
comment
если imageColumn равно imageColumn = musicCursor.getColumnIndex(MediaStore.Audio.AlbumColumns.ALBUM_ART); Я всегда получаю индекс -1 :( - person Hazlo8; 05.11.2015
comment
Я пытаюсь с int imageColumn2 = musicCursor2.getColumnIndex (MediaStore.Audio.Albums.ALBUM_ART); индекс равен 9, но всегда происходит сбой: CursorIndexOutOfBoundsException: запрошен индекс -1, с размером 10... но подождите, лучше, если я могу выделить кавер-альбом в каждой песне, мне не нужен весь альбом, потому что тогда мне нужно связать каждую песню с каждой кавер-песней, у меня есть только список песен, и я хочу кавер-альбом для каждой песни... - person Hazlo8; 05.11.2015