Android播放哔声,每隔n毫秒

时间:2016-09-25 07:50:31

标签: android audio media-player android-mediaplayer

我创建了一个类似节拍器的Android应用程序。 实际上我想每n毫秒发出一声嘟嘟声。 我使用MediaPlayer和计时器。

我的代码是这样的:

Soloution 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个日志声音会播放并停止播放。

解决方案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,一声响起。

如何修复此代码可以正常工作。

1 个答案:

答案 0 :(得分:1)

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

如果您将.setMaxStreams()设置为高于1的数字,则不应发出任何静音。尝试并试验。