Android进阶——声波振幅显示
最近博主想做一个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进阶——声波振幅显示的更多相关文章
- 我的Android进阶之旅------> Android在TextView中显示图片方法
面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包括图像的文本信息).并简要说明实现方法. 答案:Android SDK支持例如以下显示富文本信息的方式. 1.使用T ...
- 我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色
通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...
- 我的Android进阶之旅------> Android在TextView中显示图片方法
面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...
- 我的Android进阶之旅------> Android为TextView组件中显示的文本加入背景色
通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...
- 我的Android进阶之旅------> Android为TextView组件中显示的文本加入背景色
通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...
- Android 进阶 Android 中的 IOC 框架 【ViewInject】 (下)
上一篇博客我们已经带大家简单的吹了一下IoC,实现了Activity中View的布局以及控件的注入,如果你不了解,请参考:Android 进阶 教你打造 Android 中的 IOC 框架 [View ...
- Android开发面试经——4.常见Android进阶笔试题(更新中...)
Android开发(29) 版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...
- [置顶] 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam
由于上一篇文章:我的Android进阶之旅------>Android之动画之Frame Animation实例 中展示的是Frame动画效果,但是之前我是将图片截取下来,不好说明确切的动画过程 ...
- 我的Android进阶之旅------>经典的大牛博客推荐(排名不分先后)!!
本文来自:http://blog.csdn.net/ouyang_peng/article/details/11358405 今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超 ...
随机推荐
- TCP/IP模型的简单解释
TCP/IP模型是互联网的基础.想要理解互联网,就必须理解这个模型.但是,它不好懂,我就从来没有搞懂过. 前几天,BetterExplained上有一篇文章,很通俗地解释了这个模型.我读后有一种恍然大 ...
- 74HC595 for STM32 源代码【worldsing笔记】
74HC595是硅结构的CMOS器件, 兼容低电压TTL电路,遵守JEDEC标准. 74HC595是具有8位移位寄存器和一个存储器,三态输出功能. 移位寄存器和存储器是分别的时钟. 数据在SHcp(移 ...
- jQuery语法总结及注意事项
1.关于页面元素的引用通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom ...
- Android项目实战--手机卫士24--程序锁的实现以及逻辑
昨天我们已经把程序全部读取出来,显示到界面上了,那今天,我们就来讲一下那个程序锁的实现啦.其实也很简单啦,我们主要就是把用户要锁定的程序放到一个表里面,然后就监听手机里面的任务栈,如果发现任务栈里面出 ...
- Windows常用命令使用总结
Windows dos常用命令的熟练使用有助于提高工作效率. 1.windows+R:打开运行程序窗口 2.cmd:调用DOS命令窗口 3.mstsc:调用远程桌面命令窗口 4.mspaint:调用画 ...
- js方法重载
test(5); test(5,5); function test(a){ alert(a); } function test(a,b){ alert(a+b); } NaN和10,说明第二个覆盖了第 ...
- HDU4279(2012年天津网络赛---数论分析题)
题目:Number 题意: 给出一个f(x),表示不大于x的正整数里,不整除x且跟x有大于1的公约数的数的个数.定义F(x),为不大于x的正整数里,满足f(x)的值为奇数的数的个数.题目就是求这个F( ...
- [C#源码]VS各版本转换器(支持VS2012,VS2013)
项目名称:[C#源码]VS各版本转换器(支持VS2012,VS2013) 下载内容: (C#源码)VS各版本转换器 实现功能: 支持vs2003-vs2013的各版本转换,由高到低,由低到高都支持. ...
- 导出DC列表
$DomainName = (gwmi win32_computersystem).Domain$dn0 = $DomainName.Split(".")[0]$dn1 = $Do ...
- [React Native] Using the WebView component
We can access web pages in our React Native application using the WebView component. We will connect ...