要在 Android 应用中获取外界声音的分贝值,你可以使用 AudioRecord 类来录制音频,并计算其 RMS(均方根)值以估算分贝水平。以下是一个简单的示例:

1.添加权限:在 AndroidManifest.xml 中添加录音权限。

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    

2. 创建一个类来获取分贝值:

    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.MediaRecorder;

    public class SoundMeter {
        private static final int SAMPLE_RATE = 44100; // 采样率
        private static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        private AudioRecord audioRecord;
        private boolean isRecording = false;

        public SoundMeter() {
            audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, BUFFER_SIZE);
        }

        public void start() {
            if (audioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
                audioRecord.startRecording();
                isRecording = true;
            }
        }

        public void stop() {
            if (isRecording) {
                audioRecord.stop();
                isRecording = false;
            }
        }

        public double getAmplitude() {
            if (!isRecording) return 0;

            short[] buffer = new short[BUFFER_SIZE];
            int read = audioRecord.read(buffer, 0, BUFFER_SIZE);

            if (read == AudioRecord.ERROR_INVALID_OPERATION || read == AudioRecord.ERROR_BAD_VALUE) {
                return 0;
            }

            double sum = 0.0;
            for (int i = 0; i < read; i++) {
                sum += buffer[i] * buffer[i];
            }

            double rms = Math.sqrt(sum / read);
            return 20 * Math.log10(rms); // 转换为分贝
        }
    }
    

3. 在 Activity 中使用 SoundMeter 类:

    import android.os.Bundle;
    import android.os.Handler;
    import android.widget.TextView;
    import androidx.appcompat.app.AppCompatActivity;

    public class MainActivity extends AppCompatActivity {
        private SoundMeter soundMeter;
        private TextView dBTextView;
        private Handler handler = new Handler();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            dBTextView = findViewById(R.id.dBTextView);
            soundMeter = new SoundMeter();

            soundMeter.start();
            startUpdatingdB();
        }

        private void startUpdatingdB() {
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    double dB = soundMeter.getAmplitude();
                    dBTextView.setText("分贝: " + String.format("%.2f", dB));
                    startUpdatingdB();
                }
            }, 100); // 每 100 毫秒更新一次
        }

        @Override
        protected void onDestroy() {
            super.onDestroy();
            soundMeter.stop();
        }
    }
    

4. 布局文件 activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/dBTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="分贝: 0.00"
            android:textSize="24sp"
            android:layout_centerInParent="true"/>
    </RelativeLayout>
    

这个示例展示了如何使用 AudioRecord 类录制音频并计算其分贝值。getAmplitude 方法返回当前音频的分贝值,并在 MainActivity 中每 100 毫秒更新一次显示。