如何循环将我的媒体播放器置于延迟状态而不让声音相互播放?



我正在尝试制作一个应用程序,它会告诉用户"Ready Go",它会给用户两秒钟的时间来设置,然后随机一段时间它会说准备好,然后随机一段时间它会说开始。我让这部分工作,但现在我想循环到用户只需按下一次按钮即可继续播放的地方。但是,当我把它放在一个循环中时,它会一次运行它,最终它会同时播放所有的"Ready Go"。我能做些什么来防止这种情况发生?

public class MainActivity extends AppCompatActivity {
public Context context;
MediaPlayer mediaPlayer;
MediaPlayer mediaPlayer1;
public void start (View view) {
play();
}
public void play() {
//When I put a loop here I will get the audio playing over each other, I 
//also tried to put it in the start method but I get the same result. Is 
//there another way I should be going about this? Thanks for the help!
long range = 2000L;
Random r = new Random();
long number = (long) (r.nextDouble() * range);
long range1 = 1500L;
Random rand = new Random();
long number1 = (long) (r.nextDouble() * range);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.i("Info", "Ready");
mediaPlayer.start();
}    
}, 2000 + number);
Handler handler3 = new Handler();
handler3.postDelayed(new Runnable() {
@Override
public void run() {
Log.i("Info", "Go");
mediaPlayer1.start();
}
}, 2200 + number + number1);
}
}

使用 CompletionListener 而不是 loop, play() 中的 First Call playAudio1 方法。 代码如下,

mediaPlayer1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
playAudio2();
}
});

mediaPlayer2.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
playAudio1();
}
});

playAudio1 和 playAudio2 方法,

private void playAudio2() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Log.i("Info", "Go");
mediaPlayer1.start();
}
}, 2200 + number + number1);
}
private void playAudio1() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Log.i("Info", "Ready");
mediaPlayer1.start();
}
}, 2000 + number);
}

在mediaPlayer.start()之前使用mediaPlayer.prepare()或mediaPlayer.prepareAsync()。

只需将其放入 on Create 方法

mediaPlayer1.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
play();
}
});

这将在play方法完成mediaPlayer1后再次调用

它。 播放。

最新更新