Android 每隔 n 毫秒播放一次提示音

标签 android audio media-player android-mediaplayer

我创建了一个类似于节拍器的 Android 应用程序。 实际上我想每 n 毫秒播放一次哔声。 为此,我使用了 MediaPlayer 和计时器。

我的代码是这样的:

解决方案 1:

start_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Timer timer = new Timer("MetronomeTimer", true);
            TimerTask tone = new TimerTask() {
                @Override
                public void run() {
                    //Log
                    DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm:ss:SS");
                    Date date = new Date();
                    j++;
                    Log.i("Beep", df.format(date) + "_____" + j);
                    //Play sound
                    music = MediaPlayer.create(MainActivity.this, R.raw.beep);
                    music.start();
                }
            };
            timer.scheduleAtFixedRate(tone, 500, 500); // every 500 ms 
        }
    });

当我运行这段代码时,一切正常。但循环15次后,Log行工作正常,但声音静音。偶尔每隔 15 或 20 个 Log,声音就会播放和停止。

解决方案 2:

我移动这条线:

music = MediaPlayer.create(MainActivity.this, R.raw.beep);

TimerTask(像这样):

start_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            music = MediaPlayer.create(MainActivity.this, R.raw.beep);

            Timer timer = new Timer("MetronomeTimer", true);
            TimerTask tone = new TimerTask() {
                @Override
                public void run() {
                    //Log
                    DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm:ss:SS");
                    Date date = new Date();
                    j++;
                    Log.i("Beep", df.format(date) + "_____" + j);
                    //Play sound
                    music.start();
                }
            };
            timer.scheduleAtFixedRate(tone, 500, 500); // every 500 ms 
        }
    });

此代码也可以重复直到 500 毫秒。当周期时间减少到 400 或 300 ms 时,每 2 Log,发出一声蜂鸣声。

如何修复这段工作正常的代码。

最佳答案

SoundPool更适合播放从内存中加载的短声音。我在实现 MediaPlayer 时也遇到了问题,SoundPool 只是一种更简单且延迟更低的体验。

如果您将 .setMaxStreams() 设置为大于 1 的数字,您应该不会听到任何静音。尝试和实验。

关于Android 每隔 n 毫秒播放一次提示音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39684572/

相关文章:

java - RxJava : How can I reset a long running hot observable chain?

android - Android ListView 中的前 2 个 TextView 的样式不同

audio - 使用Julia在声音上使用fft

actionscript-3 - CS5 Flash 应用在本地运行时有声音,但在服务器中运行时静音

android - Mp3 无法在 Android 中播放

android - 如何防止我的应用程序在手机旋转时重新启动?

android - 是否可以在 android Activity 中调用 setContentView() 之前显示进度条对话框?

ios - 使用 SimpleAudioEngine 按顺序播放声音

java - 使用另一个类的 JavaFX 媒体播放器播放音频文件

java - 如何在我的 android 库中包含依赖项