Android进阶——声波振幅显示

编程入门 行业动态 更新时间:2024-10-06 22:29:04

Android<a href=https://www.elefans.com/category/jswz/34/1769503.html style=进阶——声波振幅显示"/>

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")@Overridepublic void amplitude(int amplitude, int db, int value) {// TODO Auto-generated method stubif(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;@Overridepublic 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 资源: 

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

二维码生成器: =8395189&from=as 古老读心术: =8425923&from=as 打地鼠: =8409245&from=as 2048军衔版: =8372779&from=as 疯狂的手指: =8269676&from=as


更多推荐

Android进阶——声波振幅显示

本文发布于:2024-02-14 05:55:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1762328.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:进阶   振幅   声波   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!