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

时间:2015-02-05 17:18:32

标签: android android-mediaplayer

我正在使用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

1 个答案:

答案 0 :(得分:1)

在致电MediaPlayer.setDataSource后,您应该使用MediaPlayer.reset。请注意,MediaPlayer.create方法只是调用MediaPlayer.setDataSource的辅助方法,并且可以用来播放一个媒体。在下面的示例中,上下文是您的活动,因此您可以使用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);