如何正确更改 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);
我正在使用一个 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);