java - 如何循环播放媒体播放器而不让声音相互重叠?

标签 java android loops android-mediaplayer

我正在尝试制作一个应用程序,它会告诉用户“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代替循环,首先在play()中调用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()。

关于java - 如何循环播放媒体播放器而不让声音相互重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56641735/

相关文章:

java - 如何将在线 CSV 文件导入 Java 并将每一列用作变量?

java - 在 Apache POI 中使用 WordToHtmlConverter 转换器

android - 关闭 PhoneGap App 真的可行吗?

android - 如何解决创建签名 APK 文件时遇到的问题?

java - 如何逐步提高某事的速度?

java - Java RESTful 服务的 Jquery 调用不工作 CORS

java - JUnit测试编译

android - 激励视频广告有何特别之处?

excel - 使用 VBA 的 Z 因子迭代

arrays - Kotlin forEach 订单