繁体   English   中英

创建自定义侦听器

[英]Create custom listeners

我想创建一个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循环。

仅当存在一些检测事件的代码时,侦听器才起作用。 但据我所知,您将需要手动执行此操作。 相反,如果要重复采样超过阈值的值,则最好使用计时器进行轮询。

采样率是多少?

您需要的最低延迟是多少?

例如,在44100 kHz时,如果要以1ms的精度进行响应,则只需检查每44个样本。

为什么不设置一个计时器 /回调,每1毫秒调用一次? 然后,在“反应”后取消计时器? 有几种方法可以做到这一点。 这是其中之一,使用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!
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM