如何正确更改 Android MediaPlayer 实例的当前曲目?

How to properly change current track for an Android MediaPlayer instance?

我正在使用一个 Android MediaPlayer 实例,它的初始化很简单:

mediaPlayer = MediaPlayer.create(this,R.raw.conrnfield);

我也得到这个Thread根据曲目播放进度更新SeekBar

    updateTime = new Runnable() {
        @Override
        public void run() {

            int currentPosition = 0;
            int total = mediaPlayer.getDuration();
            seekBar.setMax(total);

            while (mediaPlayer != null && currentPosition < total) {

                try {
                    Thread.sleep(500);
                    currentPosition = mediaPlayer.getCurrentPosition();

                }
                catch (InterruptedException ex) {return;}
                catch (Exception e) {return;}

                seekBar.setProgress(currentPosition);
            }
        }
    };

我找到了改变当前曲目的方法:

public void changeSong(View view) {

        mediaPlayer.reset();
        mediaPlayer.start();
        mediaPlayer.selectTrack(2);

}

但是,当我调用此方法时,它会导致应用程序崩溃。我首先可以在日志中看到

java.lang.IllegalStateException: Could not execute method of the activity

堆栈跟踪中的错误消息。

我什至不知道我的做法是不是错了。这是整个log

您应该在调用 MediaPlayer.reset 之后使用 MediaPlayer.setDataSource。请注意,MediaPlayer.create 方法只是调用 MediaPlayer.setDataSource 的辅助方法,并且假设用于播放一个媒体。在以下示例中,上下文是您的 Activity,因此您可以将它们替换为 MainActivity.this

Uri uri = new Uri.Builder()
    .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
    .authority(context.getPackageName())
    .appendPath(String.valueOf(R.raw.conrnfield))
    .build();
mediaPlayer.setDataSource(context, uri);