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

Android play beep sound, every n milliseconds

我创建了一个类似于节拍器的 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,声音就会播放和停止。

方案二:

我移动这条线:

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 毫秒时,每 2 个 Log,发出一声蜂鸣声。

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

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

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