我想创建一个Android应用程序,如果麦克风的振幅达到一定水平,我必须做出反应。
现在我正在使用此代码:
MediaRecorder soundRecorder = new MediaRecorder();
soundRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
soundRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
soundRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
soundRecorder.setOutputFile("/dev/null");
soundRecorder.prepare();
soundRecorder.start();
int amplitude = 0;
while (amplitude < MyApp.this.ampToReact) {
amplitude = soundRecorder.getMaxAmplitude();
}
但我知道这是非常糟糕的编程(我的应用程序一直在崩溃)。
所以我想创建一个带有onAmplitudeReachedDefiniteLevel()
方法的侦听器来替换这个丑陋的while循环。
答案 0 :(得分:1)
只有在存在某些代码来检测事件时,侦听器才会起作用。但据我所知,你需要手动完成这项工作。相反,如果您重复采样超过阈值的事物,最好使用计时器进行轮询。
采样率是多少?
您需要的最低延迟是多少?
例如,在44100 kHz,如果你想以1ms的精度做出反应,那么你只需要检查每44个样本。
为什么不设置timer /回调,每1 ms调用一次?然后在您做出反应后取消定时器&#39;?
有几种方法可以做到这一点。这是其中之一,使用了android Handler
(未经测试 - 抱歉,如果需要调整的话!)
final int POLL_INTERVAL = 100; // milliseconds
Handler h = new Handler(); // this is where you feed in messages
OnClickListener startbuttonListener = new OnClickListener() {
// for example, if you want to start listening after a button press:
public void onClick(View v) {
h.postDelayed(poll, POLL_INTERVAL); // start running the poll loop
}
};
Runnable poll = new Runnable() {
public void run() {
if(soundRecorder.getMaxAmplitude() > MyApp.this.ampToReact){
h.postDelayed(soundTrigger, 0); // run your sound trigger if criterion met
}else h.postDelayed(this, POLL_INTERVAL); // post this Runnable (i.e. poll) again
}
}
Runnable soundTrigger = new Runnable() {
public void run(){
// TRIGGERED!
}
}