Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我想在连续噪音响起时激活传感器(Android Studio)_Java_Android_Android Layout_Android Fragments - Fatal编程技术网

Java 我想在连续噪音响起时激活传感器(Android Studio)

Java 我想在连续噪音响起时激活传感器(Android Studio),java,android,android-layout,android-fragments,Java,Android,Android Layout,Android Fragments,我正在学习编程,事实是我没有太多的想法。我正在编程一个由音频传感器组成的应用程序,当听到房子里有噪音时,它就会被激活。我现在有这个代码 活动检测器噪声 public class DetectNoise { // This file is used to record voice static final private double EMA_FILTER = 0.6; private MediaRecorder mRecorder = null; private

我正在学习编程,事实是我没有太多的想法。我正在编程一个由音频传感器组成的应用程序,当听到房子里有噪音时,它就会被激活。我现在有这个代码

活动检测器噪声

public class DetectNoise {




   // This file is used to record voice
   static final private double EMA_FILTER = 0.6;

   private MediaRecorder mRecorder = null;
   private double mEMA = 0.0;

   public void start() {



       if (mRecorder == null) {


           mRecorder = new MediaRecorder();
           mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
           mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
           mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
           mRecorder.setOutputFile("/dev/null");

           try {
               mRecorder.prepare();
               mRecorder.start();
               mEMA = 0.0;
           } catch (IllegalStateException e) {
               Log.e("Error",e.toString());
               e.printStackTrace();
           } catch (IOException e) {
               // TODO Auto-generated catch block
               Log.e("Error",e.toString());
               e.printStackTrace();
           }

       }
   }



public double getAmplitude() {



       if (mRecorder != null)
           //return  (mRecorder.getMaxAmplitude()/1100.0);


           return   20 * Math.log10(mRecorder.getMaxAmplitude() / 2000);
       else
           return 0;

   }

public double getAmplitudeEMA() {
       double amp = getAmplitude();
       mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
       return mEMA;
   }

活动一

private int mThreshold;
private static final int POLL_INTERVAL = 300;
mSensor = new DetectNoise();
private Handler mHandler = new Handler();

private Runnable mPollTask = new Runnable() {
       public void run() {

               double amp = mSensor.getAmplitude();
               //Log.i("Noise", "runnable mPollTask");
               updateDisplay("Monitoring Voice...", amp);

               if ((amp > mThreshold)) {
                   callForHelp(amp);
                   //Log.i("Noise", "==== onCreate ===");
               }// Runnable(mPollTask) will again execute after POLL_INTERVAL
               mHandler.postDelayed(mPollTask, POLL_INTERVAL); }


问题是任何声音都会激活它。我希望它只在声音持续约5或7秒时激活

有人能帮我吗?
非常感谢您所做的一切

开始初始时间戳为空,您可以从第一个振幅开始记录时间戳,如果它们在检测过程中消失,您可以将时间戳重置为空,如果声音持续存在,则将保留第一个录制的时间戳。您只需确定时间戳,然后通过减法判断声音持续时间即可获得时间戳记录

/**
*对不起,我的英语很差
*/
导入java.util.Random;
公共类测试实现可运行{
//你可以试着开始
公共静态void main(字符串[]args){
新线程(新测试()).start();
}
私有静态Long lastTime=null;
@凌驾
公开募捐{
//这是一个循环监视器,用于监视记录音量
while(true){
char temp=getAmplium();
System.out.print(temp);//测试输出
试一试{
//首次检测到声音
如果(lastTime==null&&temp!=''''
lastTime=System.currentTimeMillis();
//检测到停止的声音
如果(温度=“”“”)
lastTime=null;
//声音不断传来
//判断时间间隔
if(lastTime!=null&&System.currentTimeMillis()-lastTime>=2*1000){
//说两秒钟以上
System.out.println(“--|>发言超过两秒”);
lastTime=null;
}
//采样率为100毫秒
睡眠(100);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
//--------------------------------------------------------------
//模拟记录音量
私有静态字符getAmplium(){
//如果有声音输出“A”,则没有声音输出“\
//您可以通过声级确定是否有声音
//这是一个例子

if(new Random().nextInt(100)感谢您这么快的回复,但我不明白您的答案,我编程时间很短,而且我是一个糟糕的程序员。举例来说,它更容易理解。请在一个答案中发布所有内容。不要对同一个问题多次给出答案。