IllegalStateException: 无法从 CursorWindow 读取第 0 行 col -1。在从光标访问数据之前,请确保光标已正确初始化



我是Android的新手。我正在使用服务实施音乐播放器。这是将错误集中的代码。谁能帮我解决这个错误?

public void getSong() {
    ContentResolver contentResolver = getContentResolver();
    Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Cursor cursor = contentResolver.query(musicUri, null, null, null, null);
    if (cursor != null && cursor.moveToFirst()) {
        do {
            long thisId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID));
            String thisTitle = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
            String thisArtist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
            int albumId = cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ART);
            String thisArt = cursor.getString(albumId);
            musicArrayList.add(new Music(thisId, thisTitle, thisArtist, thisArt));
        } while (cursor.moveToNext());
    }
}

确保您在其中获取具有相同列名的数据的表查看此http://www.rjkfw.com/android/s3035.html

在提取数据之前检查null。

ListView audioListView = (ListView) findViewById(R.id.songView);
   ArrayList<string> audioList = new ArrayList<>();
   String[] proj = { MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DISPLAY_NAME };// Can include more data for more details and check it.
   Cursor audioCursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, proj, null, null, null);
   if(audioCursor != null){
       if(audioCursor.moveToFirst()){
           do{
               int audioIndex = audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
               audioList.add(audioCursor.getString(audioIndex));
           }while(audioCursor.moveToNext());
       }
   }
   audioCursor.close();
   ArrayAdapter<string> adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,android.R.id.text1, audioList);
   audioListView.setAdapter(adapter);

错误解决了错误,因为我正在寻找特定歌曲的专辑,因此在光标中传递了null值。因此,我更改了光标守则如下:

public void getSong() {
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                new String[]{MediaStore.Audio.Media._ID,
                        MediaStore.Audio.Media.TITLE,
                        MediaStore.Audio.Media.ARTIST,
                        MediaStore.Audio.Media.ALBUM},
                MediaStore.Audio.Media.IS_MUSIC + "=1",
                null,
                null);

        if (cursor != null && cursor.moveToFirst()) {
            do {
                long thisId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
                String thisTitle = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
                String thisArtist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
                String thisImage = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
                songList.add(new Music(thisId, thisTitle, thisArtist, thisImage));
}while (cursor.moveToNext());
}

我尝试通过在服务类中调用playsong()的getgongimage(uri)方法,以获取以下专辑:

public void getSongImage(Uri uri) {
        MediaMetadataRetriever mmr = new MediaMetadataRetriever();
        mmr.setDataSource(this,uri);
        byte [] data = mmr.getEmbeddedPicture();
        if(data==null){
            activitySongDetailBinding.imgMusic.setImageResource(R.drawable.img);
        }else {
            Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
            activitySongDetailBinding.imgMusic.setImageBitmap(bitmap);
        }
    }

其中uri = contenturis.withappendedId( android.provider.mediastore.audio.media.external_content_uri,sonsyarraylist.get(songposn).getId())

相关内容

最新更新