Android 我想检查一下安卓系统中声音的响度

Android 我想检查一下安卓系统中声音的响度,android,audio,Android,Audio,我正在开发一个应用程序,我必须检测声音的响度。这意味着手机上的一些叫声,它会在屏幕上显示音量级别 哪种API可用于此目的?查看 读取缓冲器时,字节值将表示振幅。字节值越高,声音越大 这是我不久前在一个应用程序中使用的东西的缩小版: 将此添加到mainifest.xml中 soundlevel.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_wid

我正在开发一个应用程序,我必须检测声音的响度。这意味着手机上的一些叫声,它会在屏幕上显示音量级别

哪种API可用于此目的?

查看

读取缓冲器时,字节值将表示振幅。字节值越高,声音越大

这是我不久前在一个应用程序中使用的东西的缩小版:

将此添加到mainifest.xml中

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);
}
};
}

谢谢您的回复。你能给我一个代码实现的例子吗。帮我吧。