最近博主想做一个app,中间有一个是录音的功能。于是博主想把UI做的好看一些,想仿照微信或者QQ语音输入时,能够随着声音的大小显示声波振幅。于是查找了一些资料,现在把这个功能的Demo分享给大家,以后也会把更多的项目学习到的知识分享给大家。

其实这个功能主要是依靠MediaRecorder的getMaxAmplitude()方法来获得声音的振幅,然后依据计算公式分贝的计算公式K=20lg(Vo/Vi) Vo当前的振幅值,Vi基准值为600来获得分贝数然后在根据分贝来显示ImageView上的不同图片。这样就实现了声波振幅显示了。

下面列出主要的函数,后面会给出录音显示声波振幅的Demo下载链接:

	public RecordDialog(Context context){
this.context=context;
dialog_view=LayoutInflater.from(context).inflate(R.layout.dialog_sound, null); //初始化振幅图片
progressImg[0]=context.getResources().getDrawable(R.drawable.mic_1);
progressImg[1]=context.getResources().getDrawable(R.drawable.mic_2);
progressImg[2]=context.getResources().getDrawable(R.drawable.mic_3);
progressImg[3]=context.getResources().getDrawable(R.drawable.mic_4);
progressImg[4]=context.getResources().getDrawable(R.drawable.mic_5);
progressImg[5]=context.getResources().getDrawable(R.drawable.mic_6);
progressImg[6]=context.getResources().getDrawable(R.drawable.mic_7); dialog=new AlertDialog.Builder(context).setView(dialog_view).show();
// dialog.cancel(); progress=(ImageView) dialog_view.findViewById(R.id.sound_progress);
btn_cancel=(ImageView) dialog_view.findViewById(R.id.cancel);
btn_submit=(TextView) dialog_view.findViewById(R.id.submit);
mic_icon=(ImageView) dialog.findViewById(R.id.mic);
dialog_title=(TextView) dialog.findViewById(R.id.title);
txt_msg=(TextView) dialog.findViewById(R.id.msg); btn_cancel.setOnClickListener(onCancel);
btn_submit.setOnClickListener(onSubmit);

  

然后我们实现一个自定义的接口SoundAmplitudeListen用来处理获取分贝值之后显示不同的波动图片:

private SoundAmplitudeListen onSoundAmplitudeListen=new SoundAmplitudeListen() {

		@SuppressWarnings("deprecation")
@Override
public void amplitude(int amplitude, int db, int value) {
// TODO Auto-generated method stub
if(value>=6){
value=6;
}
progress.setBackgroundDrawable(progressImg[value]);
}
};

  

最后就是录音时处理分贝的RecodeManager类了:


package com.example.voiceviewdemo;

import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Locale; import android.R.integer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.Handler;
import android.text.format.DateFormat; public class RecodeManager { private File file;//录音文件
private MediaRecorder mediaRecorder;//android 媒体录音类
private SoundAmplitudeListen soundAmplitudeListen;//声波振幅监听器
private final Handler mHandler=new Handler();
private Runnable mUpdateMicStatusTimer=new Runnable() {
/**
* 分贝的计算公式K=20lg(Vo/Vi) Vo当前的振幅值,Vi基准值为600
*/
private int BASE=500;
private int RATIO=5;
private int postDelayed=200;
@Override
public void run() {
int ratio=mediaRecorder.getMaxAmplitude()/BASE;
int db=(int)(20*Math.log10(Math.abs(ratio)));
int value=db/RATIO;
if(value<0) value=0;
if(soundAmplitudeListen!=null){
soundAmplitudeListen.amplitude(ratio, db, value);
mHandler.postDelayed(mUpdateMicStatusTimer,postDelayed);
}
}
}; public void startRecordCreateFile() throws IOException{
if(!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)){
return ;
}
file=new File(Environment.getExternalStorageDirectory()+File.separator+"1"+File.separator+
new DateFormat().format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA))+".amr");
mediaRecorder=new MediaRecorder();//创建录音对象
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);//从麦克风源进行录音
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//设置输出格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//设置编码格式
mediaRecorder.setOutputFile(file.getAbsolutePath()); //创建文件
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
file.createNewFile();
mediaRecorder.prepare();
mediaRecorder.start();
mHandler.post(mUpdateMicStatusTimer);
} public File stopRecord(){
if(mediaRecorder!=null){
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder=null;
mHandler.removeCallbacks(mUpdateMicStatusTimer);
}
return file;
}
public void setSoundAmplitudeListen(SoundAmplitudeListen soundAmplitudeListen){
this.soundAmplitudeListen=soundAmplitudeListen;
}
public interface SoundAmplitudeListen{
public void amplitude(int amplitude,int db,int value);
}
}

  


效果如下:

Demo 资源: http://download.csdn.net/detail/u014132820/9369346

下面给出博主自己开发的一些小App,分享给大家:

Android进阶——声波振幅显示的更多相关文章

  1. 我的Android进阶之旅------&gt; Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包括图像的文本信息).并简要说明实现方法. 答案:Android SDK支持例如以下显示富文本信息的方式. 1.使用T ...

  2. 我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色

    通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...

  3. 我的Android进阶之旅------> Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...

  4. 我的Android进阶之旅------&gt; Android为TextView组件中显示的文本加入背景色

    通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...

  5. 我的Android进阶之旅------> Android为TextView组件中显示的文本加入背景色

    通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...

  6. Android 进阶 Android 中的 IOC 框架 【ViewInject】 (下)

    上一篇博客我们已经带大家简单的吹了一下IoC,实现了Activity中View的布局以及控件的注入,如果你不了解,请参考:Android 进阶 教你打造 Android 中的 IOC 框架 [View ...

  7. Android开发面试经——4.常见Android进阶笔试题(更新中...)

      Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...

  8. [置顶] 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam

    由于上一篇文章:我的Android进阶之旅------>Android之动画之Frame Animation实例 中展示的是Frame动画效果,但是之前我是将图片截取下来,不好说明确切的动画过程 ...

  9. 我的Android进阶之旅------>经典的大牛博客推荐(排名不分先后)!!

    本文来自:http://blog.csdn.net/ouyang_peng/article/details/11358405 今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超 ...

随机推荐

  1. HW6.18

    public class Solution { public static void main(String[] args) { double[] array = {6.0, 4.4, 1.9, 2. ...

  2. 【noip2011】观光公交

    题解: 做这题的时候为了敢速度- - 直接orz了神小黑的题解 其实我还是有想一个拙计的方法的- - dp:f[i][j] 表示到i点使用j个加速器 在i前上车的人的时间和 轻松愉悦转移之 - - 但 ...

  3. 【noip2011】Mayan游戏

    题解: 刷了一天的noip啊 做了10题! 突然找回了做马拉松的感觉- - 我中午竟然放弃治疗去看视频 做到晚上累得都快挂了 用电脑放一些rock 把音乐当咖啡硬撑下来 但是还是没能刷3届 唉 显然速 ...

  4. HDU-4642 Fliping game 简单博弈

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4642 看右下角的状态就行了,因为上面的操作每次都会改变它,而最后的局势是根据它来的... //STAT ...

  5. [思维题]Bored Qishen

    给出一个整数集,其中包含1-n的所有整数,要求挑选出一个元素最多的子集,使得子集中任意两数的乘积不是完全平方数 (n<=10^6) 求这样一个最大子集的元素个数 #include <cst ...

  6. [iOS基础控件 - bugs]

    1.不能呼出iOS模拟器键盘 Can't find keyplane that supports type 4 for keyboard iPhone-Portrait-NumberPad 解决:Ha ...

  7. CSS构造颜色、背景与图像

    设定颜色 背景使用 图像使用 1.设定颜色 红色的几种合法定义;     #f00;     #ff0000;     Red;     Rgb(255,0,0);     Rgb(100%,0%,0 ...

  8. delphi 窗体透明

        TransparentColor:=true;    TransparentColorValue:=clFuchsia;    Color:= TransparentColorValue;  ...

  9. jquery 源码分析学习地址

    http://www.ccvita.com/121.htmljQuery工作原理解析以及源代码示例http://www.cnblogs.com/haogj/archive/2010/04/19/171 ...

  10. 【linux c learn 之stat】获取文件的属性

    NAME stat 获取文件属性 这个函数位于<sys/stat.h>头文件里 函数原型: int stat(const char *path, struct stat *buf); 參数 ...