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. 高通、猎户机型Android典型bootloader分析
  2. 磁盘与目录的容量(转)
  3. [PAT乙级]1046 划拳
  4. oracle数据库安装跳坑
  5. JSP中meta http-equiv=pragma content=no-cache属性ttp-equiv功能介绍转载
  6. ios php 聊天_解析php做推送服务端实现ios消息推送
  7. java执行脚本命令 学习笔记
  8. 【病毒查杀】CAD杀毒方法
  9. 基于ESP32CAM实现WebSocket服务器实时点灯
  10. 八十年代的古董级晶体管直流稳压电源 WYJ-15V/1A
  11. 量子计算从概念走入现实,公钥加密是否岌岌可危
  12. 微信扫一扫二维码直接下载APP的实现方式
  13. matlab 图片叠加
  14. 0x120-从头开始写操作系统-启动扇区与内存的关系及内存寻址的应用
  15. linux系统修复home文件夹,在Linux操作系统上修复损坏的主分区/主目录
  16. C++ 数据存储类型
  17. 连续10年霸榜第一 程序员「最常用」的编程语言是。。。。
  18. 做网络推广有什么方法和技巧?
  19. win7 远程桌面操作步骤
  20. 如何用 ModelScope 实现 “AI 换脸” 视频

热门文章

  1. C++ 返回引用与返回值区别
  2. (附源码)springboot手工diy网站 毕业设计 310226
  3. 尤瓦尔·赫拉利 | 认识你自己,不要被算法操控
  4. dsm5.0 mysql_群晖针对OpenSSL Heartbleed安全漏洞推出DSM 5.0更新
  5. 币圈“杀熟”远比你想象的严重 ,99%的亏损是被身边人所带
  6. android 编译 汇编,汇编语言写的hellworld,在安卓手机上运行
  7. 基于顺承关系的事理图谱的构建
  8. Net core中使用System.Drawing对上传的图片流进行压缩
  9. AUTOSAR ComM模块介绍
  10. (二)S7Comm协议分析