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

}

@Override

protected 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;

}

结果

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

源码下载地址

android分贝仪界面,android声音检测仪---分贝仪 (附源码)相关推荐

  1. ANDROID物联网开发从入门到实战附源码

    本书从获取源码和搭建应用开发环境开始讲起,依次讲解了基础知识篇.数据传输篇.信息识别篇.传感器应用篇和技术提高篇这 5大部分内容. 目录 第1篇 基础知识篇 第1章 Android系统介绍 2 1.1 ...

  2. Android开发之拍照功能实现(附源码)

    大家好,这是一个简单的拍照功能,很简单的界面,一个显示图像区域SurfaceView一个"拍照"按钮.直接上代码! 1.CameraDemoActivity.java(主界面) p ...

  3. 【android-tips】如何在android应用中插入百度广告(附源码)

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.介绍    现在游戏中的广告基本上已经成为了游戏创作者的一个重要的收入来源.其实插入广告还是挺简单的,本文选 ...

  4. android+酷炫动画效果,Android简单酷炫点击动画(附源码)

    在Android5.0之前, Android的点击效果一直很low, 即使5.0的波纹效果也不尽如人意. 而我之前写过一种比较酷炫的点击效果, 最近抽了点时间完善一下, 把阴影效果加入了进去, 大家先 ...

  5. Android 商城类应用实战之购物车附源码

    本文授权发布公众号[刘桂林],星球[Hi Android] 本文为实战类项目,所以陈述的逻辑为实现流程 + 核心代码,主要实现的还是购物车的动画与结算,首先我们来看下整体的效果图: 购物车一般都是后台 ...

  6. android+usb模拟点击,Android后台模拟点击探索(附源码)

    工作中我们需要自制一套工具,其中遇到需要模拟点击事件的需求,类似按键精灵的功能,支持后台持续运行,满足触发条件时完成点击. 经过一番探索,一共整理出两种不同的方案:AccessibilityServi ...

  7. android 模拟点击某点,Android后台模拟点击探索(附源码)

    工作中我们需要自制一套工具,其中遇到需要模拟点击事件的需求,类似按键精灵的功能,支持后台持续运行,满足触发条件时完成点击. 经过一番探索,一共整理出两种不同的方案:AccessibilityServi ...

  8. 高仿小米计算器界面UI 适合新手学习 [附源码]

    初学Android尝试着做一些布局,看到手机上的小米计算器界面简洁,适合新手尝试,于是做了一下,但是未实现逻辑,只是高仿界面. 小米计算器UI 高仿小米计算器UI 源码:https://downloa ...

  9. android 手机壁纸源码,Android工程实现换壁纸功能【附源码】

    最近工作要实现换壁纸小功能,将代码做成demo发出来 没有采用zip格式换肤,因为只是更换一张图片背景 1.将三张图放入drawable-hdpi,我放的是480*800的 2.用sharedPref ...

  10. android广告SDK原理详解(附源码)

    广大的开发者吃糠咽菜开发了一两款APP,获取了一些流量后自然就会想到流量变现,一般情况下大家会选择到百度联盟或者Google Admob这些广告服务提供商注册开发者账号,在自己的APP里面加上几行广告 ...

最新文章

  1. Nginx如何实现支持HTTPS协议详细说明
  2. timer 公司内部用法
  3. network怎么断点调试_Windows 网络编程:调试 API
  4. hive 导出json格式 文件_hive存储json格式文件
  5. DCL 管理用户 mysql
  6. Python入门--字符串的比较
  7. 【图论】拉普拉斯矩阵(Laplacian matrix)
  8. 自制一个H5图片拖拽、裁剪插件(原生JS)
  9. 如何快速运行一个php文件
  10. Matlab运行.m文件
  11. 先选价、再叫车 高德打车首创上线“比价叫车”
  12. 苹果编程新纪元 之 Swift
  13. 【无人机三维路径规划】基于A算法解决三维路径规划问题含危险障碍地形含Matlab源码
  14. 基于VTK的PACS系统的开发 心路历程2
  15. 自动给服务器装linux,Linux全自动PXE无人值守安装服务器配置 | 旺旺知识库
  16. 计算机方面的文献在哪里找,最新浅谈计算机参考文献 浅谈计算机专著类参考文献哪里找...
  17. 白盒测试与黑盒测试的比较
  18. 云南艺术学院艺考开考 万人追逐艺术梦
  19. python里的rindex是什么意思_用Python操作字符串之rindex()方法的使用
  20. 如何将jpg等格式的图片转化为yuv

热门文章

  1. #SORA#celery原生配置文件研究
  2. 【观察】出门问问:数字化转型“从0到1”的蜕变
  3. ARM 开发板安装Alpine Linux (英)
  4. 弋阳一中2021高考成绩查询,凝心聚力 干在实处——弋阳一中成功召开2020-2021学年度上学期期末总结大会...
  5. 第五章-Linux实操篇
  6. HDU4730--We Love MOE Girls HDU(148)
  7. Ubuntu18.04 在线安装显卡驱动
  8. 知觉:看到什么就是什么
  9. 计算方法(四):插值与拟合
  10. 用错错错错错错知知中算改改不不写一句富含哲理的话