android声音检测仪---分贝仪

文章出处:大黑个人博客--android声音检测仪---分贝仪
源码下载地址:https://github.com/halibobo/SoundMeter

背景

最近小区旁边工地施工,今一大早就被工地传来的guang!guang!...吵醒了。很响很响的那种,你们肯定会问具体有多响?具体要多响?怎么描述呢?顿时就萌生出开发一款记录声音响度的app,忙活了一下午于是就出了这个声音检测仪

简介

android端的声音检测程序,实时获取当前周围环境的声压级,也就是平常所说的分贝值

源码

声音采集利用系统的MediaRecorder

/** * 录音 * @return 是否成功开始录音 */public boolean startRecorder(){    if (myRecAudioFile == null) {        return false;    }    try {        mMediaRecorder = new MediaRecorder();        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);        mMediaRecorder.setOutputFile(myRecAudioFile.getAbsolutePath());        mMediaRecorder.prepare();        mMediaRecorder.start();        isRecording = true;        return true;    } catch(IOException exception) {        mMediaRecorder.reset();        mMediaRecorder.release();        mMediaRecorder = null;        isRecording = false ;        exception.printStackTrace();    }catch(IllegalStateException e){        stopRecording();        e.printStackTrace();        isRecording = false ;    }    return false;}  /**  * 获取声压值  */ public float getMaxAmplitude() {     if (mMediaRecorder != null) {         try {             return mMediaRecorder.getMaxAmplitude();         } catch (IllegalArgumentException e) {             e.printStackTrace();             return 0;         }     } else {         return 5;     } }

在MainActivity中开启一个线程定时获取声压值并转为分贝

private void startListenAudio() {    thread = new Thread(new Runnable() {        @Override        public void run() {            while (isThreadRun) {                try {                    if(bListener) {                        volume = mRecorder.getMaxAmplitude();  //获取声压值                        if(volume > 0 && volume < 1000000) {                            World.setDbCount(20 * (float)(Math.log10(volume)));  //将声压值转为分贝值                        }                    }                    Thread.sleep(100);                } catch (InterruptedException e) {                    e.printStackTrace();                    bListener = false;                }            }        }    });    thread.start();}

自定义显示分贝值得大圆盘View 取名SoundDiscView

private float scaleWidth, scaleHeight;private int newWidth, newHeight;private Matrix mMatrix = new Matrix();private Bitmap indicatorBitmap;private Paint paint = new Paint();static final long  ANIMATION_INTERVAL = 100;private void init() {    Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.noise_index);    int bitmapWidth = myBitmap.getWidth();    int bitmapHeight = myBitmap.getHeight();    newWidth = getWidth();    newHeight = getHeight();    scaleWidth = ((float) newWidth) /(float) bitmapWidth;  // 获取缩放比例    scaleHeight = ((float) newHeight) /(float) bitmapHeight;  //获取缩放比例    mMatrix.postScale(scaleWidth, scaleHeight);   //设置mMatrix的缩放比例    indicatorBitmap = Bitmap.createBitmap(myBitmap, 0, 0, bitmapWidth, bitmapHeight, mMatrix,true);  //获取同等和背景宽高的指针图的bitmap    paint = new Paint();    paint.setTextSize(55);    paint.setAntiAlias(true);    paint.setTextAlign(Paint.Align.CENTER);  //抗锯齿    paint.setColor(Color.WHITE);}@Overrideprotected void onDraw(Canvas canvas) {    super.onDraw(canvas);    currentAngle = getAngle(World.dbCount); //获取指针应该显示的角度    mMatrix.setRotate(getAngle(World.dbCount), newWidth / 2, newHeight * 215 / 460);   //片相对位置    canvas.drawBitmap(indicatorBitmap, mMatrix, paint);    postInvalidateDelayed(ANIMATION_INTERVAL);    canvas.drawText((int)World.dbCount+" DB", newWidth/2,newHeight*36/46, paint); //图片相对位置}

运行发现指针滑动的太突兀,做个缓慢过度

public static float dbCount = 40; private static float lastDbCount = dbCount;public static void setDbCount(float dbValue) {    dbCount = lastDbCount + (dbValue - lastDbCount) * 0.2f;     lastDbCount = dbCount;}

结果

这里的分贝值是手机系统录音时获取的,手机厂商都对这个值设置了上限而且手机厂商之间都是有差别的,所以获取声音的分贝值会有点偏差。但是最终运行起来的效果还是很满意的。下面附上源码
源码下载地址

转载于:https://www.cnblogs.com/daheihei/p/5562885.html

更多相关文章

  1. 【Android应用实例之五】调节播放器音量——AudioManager的应用
  2. Android(安卓)音频的播放之一
  3. Android的SoundPool类使用与利弊
  4. android 播放默认铃声和手机振动
  5. Android(安卓)实时采集声音的频率和大小
  6. Android(安卓)使用SoundPool播放音频
  7. 第95章、手机服务之AudioManager服务(从零开始学Android)
  8. Android中SoundPool放声音
  9. Android(安卓)播放指定频率正弦波声音

随机推荐

  1. abd找不到设备的解决方法
  2. [置顶] 安卓UI组件之ListView详解
  3. Android界面设计基本知识
  4. geekband android #5 第八周分享
  5. Eclipse中跟踪调试Android源代码
  6. 继续推荐Android12个自测源码
  7. andrid系统的架构
  8. Android编译时出现"Unable to execute de
  9. Android启动Activity之后阻止EditText自
  10. EClipse 项目导入 Android(安卓)Studio