我有一个SeekBar
和一个MediaPlayer
。我想在它暂停时寻找,但似乎文档对我说谎:
请注意,seekTo(int) 也可以在其他状态下调用,例如 Prepared、Paused 和 PlaybackCompleted 状态。
像往常一样,在 Android 上我必须编写解决方法而不是代码(MediaPlayer
此时我不知道处于哪种状态,所以这个表和状态机完全没用)。因为onSeekComplete
onCompletion
调用了方法而不是(超过 9000 次,我不是在开玩笑)!仅在从(WHY, GOD, WHY???)onSeekComplete
调用之后才调用。我什至不知道该怎么办。我花了大约 5 个小时在它上面,没有任何东西是固定的。我能做些什么?seekTo
onPrepared
UPD
这是我的代码。
private void setupMediaPlayer() {
savedMediaPlayerState = null;
mediaPlayer = application.getMediaPlayer();
String mp3Path = "/path/to/mp3";
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnSeekCompleteListener(this);
mediaPlayer.setOnErrorListener(this);
mediaPlayer.setDataSource(mp3Path);
mediaPlayer.prepare();
}
@Override
public void onProgressChanged(android.widget.SeekBar sb, int i, boolean b) {
Log.i(TAG, String.format("Progress changed! %d", i));
if (b) {
mediaPlayer.seekTo(i);
updateProgressBarAndDurationLabels(i, mediaPlayer.getDuration(), false);
}
}
@Override
public void onStartTrackingTouch(android.widget.SeekBar sb) {
handler.removeCallbacks(updateTimeTask);
mediaPlayer.pause();
}
@Override
public void onStopTrackingTouch(android.widget.SeekBar sb) {
int totalDuration = mediaPlayer.getDuration();
int currentPosition = sb.getProgress();// * totalDuration / 100;
mediaPlayer.seekTo(currentPosition);
mediaPlayer.start();
updateProgressBar();
isSeeking = false;
}
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
if (!isSeeking) {
Log.i(TAG, "completed"); // Called over 9000 times
audioStopped();
}
}
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i2) {
return false; // Error -38 lol
}
@Override
public void onSeekComplete(MediaPlayer mp) {
Log.i(TAG, String.format("seek to: %d", mp.getCurrentPosition()));
isSeeking = false;
}