我对android很陌生,我已经搜索了很长一段时间。我想构建一个类似于分贝计的应用程序。它实时显示声级。如果房间里有很多噪音,就会有什么迹象表明,如果它安静,就会有什么迹象表明!。

我完全不知道如何做到这一点。谁能解释一下麦克风声级应用程序的基础知识?如果可能的话,也许提供一些代码?

谢谢!

最佳答案

您可以使用 MediaRecorder.getMaxAmplitude()

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO},
            RECORD_AUDIO);
}
  • 使用 MediaRecorder 获取噪声级别,
    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();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mRecorder.start();
    
  • 启动 MediaRecorder,
    private Runnable mSleepTask = new Runnable() {
        public void run() {
            //Log.i("Noise", "runnable mSleepTask");
            mSensor.start();
            if (!mWakeLock.isHeld()) {
                 mWakeLock.acquire();
            }
            //Noise monitoring start
            // Runnable(mPollTask) will execute after POLL_INTERVAL
            mHandler.postDelayed(mPollTask, POLL_INTERVAL);
        }
    };
    
  • 创建 Runnable Thread 经常检查噪音水平,
    private Runnable mPollTask = new Runnable() {
        public void run() {
            double amp = mSensor.getAmplitude();
            //Log.i("Noise", "runnable mPollTask");
            // Runnable(mPollTask) will again execute after POLL_INTERVAL
            mHandler.postDelayed(mPollTask, POLL_INTERVAL);
        }
    };
    

  • 使用以下公式将振幅转换为分贝,
    return 20 * Math.log10(mRecorder.getMaxAmplitude() / 2700.0);
    
  • 监控声音和警报是否有更大的噪音。
    // Create runnable thread to Monitor Voice
    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);
        }
    };
    
  • 关于java - 在 Android 中获取麦克风声级(分贝级),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7197798/

    10-10 17:25