要在 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 毫秒更新一次显示。