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 中。

4

2 回答 2

1

您应该使用Uri.parse("content://media/external/audio/albumart");来查询专辑封面。您可以在 此 StackOverflow 帖子中获得更多信息。

于 2015-11-04T16:51:21.717 回答
1

您正在使用的查询不返回该列MediaStore.Audio.AlbumColumns.ALBUM_ART。你现在有一些选择。

  1. 您可以使用@nawako 提供和链接的答案。但正如 Ian Lake 的这条 推文提醒我们的那样,官方 SDK 的一部分并没有明确地可以更改或修改。
  2. 您可以使用返回该列的查询。UsingMediaStore.Audio.Albums.EXTERNAL_CONTENT_TYPE将检索专辑列表,以及 include MediaStore.Audio.AlbumColumns.ALBUM_ART。请注意,此选项不会加载任何音乐,您需要单独查询。
  3. 您可以使用此答案中的方法从 using 中检索封面 。这不涉及对当前查询的任何修改。

这是一些实现选项 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();
    }
}
于 2015-11-04T17:14:18.450 回答