Android 我想检查一下安卓系统中声音的响度
我正在开发一个应用程序,我必须检测声音的响度。这意味着手机上的一些叫声,它会在屏幕上显示音量级别 哪种API可用于此目的?查看 读取缓冲器时,字节值将表示振幅。字节值越高,声音越大 这是我不久前在一个应用程序中使用的东西的缩小版: 将此添加到mainifest.xml中Android 我想检查一下安卓系统中声音的响度,android,audio,Android,Audio,我正在开发一个应用程序,我必须检测声音的响度。这意味着手机上的一些叫声,它会在屏幕上显示音量级别 哪种API可用于此目的?查看 读取缓冲器时,字节值将表示振幅。字节值越高,声音越大 这是我不久前在一个应用程序中使用的东西的缩小版: 将此添加到mainifest.xml中 soundlevel.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_wid
soundlevel.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ToggleButton
android:id="@+id/togglebutton_record"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ToggleButton" />
<ProgressBar
android:id="@+id/progressbar_level"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
SoundLevel.java
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.widget.CompoundButton;
import android.widget.ProgressBar;
import android.widget.ToggleButton;
public class SoundLevel extends Activity {
private static final int sampleRate = 11025;
private static final int bufferSizeFactor = 10;
private AudioRecord audio;
private int bufferSize;
private ProgressBar level;
private Handler handler = new Handler();
private int lastLevel = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.soundlevel);
level = (ProgressBar) findViewById(R.id.progressbar_level);
level.setMax(32676);
ToggleButton record = (ToggleButton) findViewById(R.id.togglebutton_record);
record.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked) {
bufferSize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT) * bufferSizeFactor;
audio = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
audio.startRecording();
Thread thread = new Thread(new Runnable() {
public void run() {
readAudioBuffer();
}
});
thread.setPriority(Thread.currentThread().getThreadGroup().getMaxPriority());
thread.start();
handler.removeCallbacks(update);
handler.postDelayed(update, 25);
} else if (audio != null) {
audio.stop();
audio.release();
audio = null;
handler.removeCallbacks(update);
}
}
});
}
private void readAudioBuffer() {
try {
short[] buffer = new short[bufferSize];
int bufferReadResult;
do {
bufferReadResult = audio.read(buffer, 0, bufferSize);
for (int i = 0; i < bufferReadResult; i++){
if (buffer[i] > lastLevel) {
lastLevel = buffer[i];
}
}
} while (bufferReadResult > 0 && audio.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING);
if (audio != null) {
audio.release();
audio = null;
handler.removeCallbacks(update);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private Runnable update = new Runnable() {
public void run() {
SoundLevel.this.level.setProgress(lastLevel);
lastLevel *= .5;
handler.postAtTime(this, SystemClock.uptimeMillis() + 500);
}
};
}
导入android.app.Activity;
导入android.media.AudioFormat;
导入android.media.AudioRecord;
导入android.media.MediaRecorder;
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.SystemClock;
导入android.widget.CompoundButton;
导入android.widget.ProgressBar;
导入android.widget.ToggleButton;
公共类声级扩展活动{
专用静态最终int采样器=11025;
私有静态final int bufferSizeFactor=10;
私人录音;
私有int缓冲区大小;
私人律师级别;
私有处理程序=新处理程序();
private int lastLevel=0;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局、声级);
级别=(ProgressBar)findViewById(R.id.ProgressBar\U级别);
级别设置最大值(32676);
ToggleButton记录=(ToggleButton)findViewById(R.id.ToggleButton_记录);
record.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener(){
检查更改后的公共无效(复合按钮视图,布尔值已检查){
//TODO自动生成的方法存根
如果(已检查){
bufferSize=AudioRecord.getMinBufferSize(采样器,AudioFormat.CHANNEL\u配置\u单声道,AudioFormat.ENCODING\u PCM\u 16位)*bufferSizeFactor;
音频=新的音频记录(MediaRecorder.AudioSource.MIC、sampleRate、AudioFormat.CHANNEL\u CONFIGURATION\u MONO、AudioFormat.ENCODING\u PCM\u 16位、bufferSize);
audio.startRecording();
Thread Thread=新线程(new Runnable(){
公开募捐{
readAudioBuffer();
}
});
setPriority(thread.currentThread().getThreadGroup().getMaxPriority());
thread.start();
handler.removeCallbacks(更新);
handler.postDelayed(更新,25);
}else if(音频!=null){
audio.stop();
audio.release();
音频=空;
handler.removeCallbacks(更新);
}
}
});
}
私有void readAudioBuffer(){
试一试{
short[]buffer=新的short[bufferSize];
int缓冲读取结果;
做{
bufferReadResult=audio.read(缓冲区,0,缓冲区大小);
for(int i=0;ilastLevel){
lastLevel=缓冲区[i];
}
}
}while(bufferReadResult>0&&audio.getRecordingState()==AudioRecord.RECORDSTATE\u录制);
如果(音频!=null){
audio.release();
音频=空;
handler.removeCallbacks(更新);
}
}捕获(例外e){
e、 printStackTrace();
}
}
private Runnable update=new Runnable(){
公开募捐{
SoundLevel.this.level.setProgress(lastLevel);
最后一级*=0.5;
handler.posttime(这是SystemClock.uptimeMillis()+500);
}
};
}
谢谢您的回复。你能给我一个代码实现的例子吗。帮我吧。