我在获取相册的专辑封面时遇到此错误。请解释一下此光标的工作原理以及如何解决此错误。
public void getAlbums() {
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0";
cursor = getContentResolver().query(uri,null, selection,null, null);
if (cursor != null && cursor.moveToFirst()) {
do {
name = (cursor.getString(cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums._ID)));
artist = (cursor.getString(cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM)));
artist1 = (cursor.getString(cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ART)));
songInfo s = new songInfo(name,artist, artist1);
_songs.add(s);
}
while (cursor.moveToNext());
cursor.close();
recyclerView1.setAdapter(albumAdapter);
}
}
答案 0 :(得分:1)
无法从CursorWindow
读取第0行,col -1
对于第0行(光标中的第一行),它不能读取索引(偏移量)-1。索引0是第一个库存,第二个是第二个等等。所以你想要访问一个不存在/不可能的列。
但是,如果无法将传递给方法的列名称作为列名称,则getColumnIndex方法将返回-1。
因此,其中一个不能解析/等同于列名。
android.provider.MediaStore.Audio.Albums._ID
android.provider.MediaStore.Audio.Albums.ALBUM
android.provider.MediaStore.Audio.Albums.ALBUM_ART
您可以依次评论每一行来确定哪一行。或者,您可以在行cursor = getContentResolver().query(uri,null, selection,null, null);
之后添加以下内容: -
String[] columns = cursor.getColumnNames();
for (String s: columns) {
Log.d("CURSORCOLUMNS","Found column = " + s);
}
Log.d("NAMECOLUMN","The name column is " + android.provider.MediaStore.Audio.Albums._ID);
Log.d("ARTISTCOLUMN","The artist column is " + android.provider.MediaStore.Audio.Albums.ALBUM);
Log.d("ARTIST1COLUMN","The artist1 column is "+ android.provider.MediaStore.Audio.Albums.ALBUM_ART);
这将显示光标中的列,后跟您希望在光标中的列。后三者中的一个不会在Found列中= ????????。这将是 -1 的原因。