为什么Android的MediaStore.Audio.Album.ALBUM_ID会导致IllegalStateException错误?

3

我正在尝试从MediaStore中获取专辑信息。我可以很容易地获取名称和艺术家,但由于某种原因,当我尝试访问ALBUM_ID列时,它会给我一个错误。

Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:450)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51    )
at android.database.CursorWrapper.getString(CursorWrapper.java:114)
at sage.musicplayer.MainActivity.getAlbumList(MainActivity.java:1540)
at sage.musicplayer.MainActivity.onCreate(MainActivity.java:238)

我似乎找不到解决方案。欢迎任何帮助!下面是我用来获取专辑信息并将其添加到 ArrayList 中的方法。

public ArrayList<Album> getAlbumList() {
    ArrayList<Album> temp = new ArrayList<>();

    /*String[] proj = {MediaStore.Audio.Albums.ALBUM_ID,
                    MediaStore.Audio.Albums.ARTIST,
                    MediaStore.Audio.Albums.ALBUM,
                    MediaStore.Audio.Albums.NUMBER_OF_SONGS
    };*/

    Cursor albumCursor = getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null, null, null, null);

    if(albumCursor != null && albumCursor.moveToFirst()) {
        int albumName = albumCursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM);
        int albumArtist = albumCursor.getColumnIndex(MediaStore.Audio.Albums.ARTIST);
        int albumID = albumCursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ID);

         do {
            String thisAlbumName = albumCursor.getString(albumName);
            String thisAlbumArtist = albumCursor.getString(albumArtist);
            String thisAlbumID = albumCursor.getString(albumID);//this line is giving me an error

            temp.add(new Album(thisAlbumName, thisAlbumArtist, thisAlbumID));
        }while(albumCursor.moveToNext());
    }
    return temp;
}

albumName、albumArtist 和 albumID 的值是什么?使用 Log.d 记录它们。 - pskink
1个回答

2
我也遇到了这个问题。你可以通过更改以下代码来轻松解决此问题: int albumID = albumCursor.getColumnIndex(MediaStore.Audio.Albums._ID); 使用_ID代替AlbumID来获取专辑的AlbumID。我不知道为什么MediaStore开发人员使用_ID而不是ALBUM_ID等其他东西。请注意保留HTML标签。

谢谢!你是最棒的,宝贝! - God Usopp
在我的情况下,它可以用string a = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums._ID));来运行。非常感谢。 - Pedo
我有一部Motorola g6手机,它出现了同样的问题。Google Pixel 2XL则没有问题。不遵守Android规范是Motorola引入漏洞和愚蠢的重要原因。现在我遇到了一个bug,因为MediaStore.Audio.Artists.Albums.ALBUM_ID在Motorola上不存在,在该过滤器中也没有_ID。最糟糕的是,除非你在有漏洞的设备上进行测试,否则你永远不会发现这种bug。Motorola真丢人。 - AndrewBloom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接