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 的数字,您应该不会听到任何静音。尝试和实验。
我创建了一个类似于节拍器的 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 的数字,您应该不会听到任何静音。尝试和实验。