相逢意气为君饮,系马高楼垂柳边。这篇文章主要讲述[Android]实现点击持续录音,松开结束录音,并实现随着分贝的大小改变图片相关的知识,希望能为你提供帮助。
显示录音大小的DIALOG实现
public class VioceDomio {
private Context mContext;
private AlertDialog dialog ;
private AlertDialog.Builder adialogbuile;
private ImageView vioce_show;
public VioceDomio(Context mContext) {
this.mContext=mContext;
}public void showRecordingDialog() {
adialogbuile = new AlertDialog.Builder(mContext, R.style.Theme_AudioDialog);
LayoutInflater inflater = LayoutInflater.from(mContext);
View view=inflater.inflate(R.layout.voice_chage,null);
vioce_show=(ImageView) view.findViewById(R.id.vioce_show);
adialogbuile.setView(view);
dialog = adialogbuile.create();
dialog.show();
dialog. getWindow().setLayout(500, 450);
}public void HideRecordingDialog() {
if(dialog!=null &
&
dialog.isShowing()) {
dialog.dismiss();
dialog=null;
}
}public void ChangeRecordingDialog(double db) {//根据录音的分贝改变大小
if(db>
=1 &
&
db<
=18) {
vioce_show.setImageResource(R.drawable.voicesearch_feedback001);
}else if(db>
=19 &
&
db<
=37) {
vioce_show.setImageResource(R.drawable.voicesearch_feedback002);
}else if(db>
=19 &
&
db<
=37) {
vioce_show.setImageResource(R.drawable.voicesearch_feedback003);
}
else if(db>
=38 &
&
db<
=56) {
vioce_show.setImageResource(R.drawable.voicesearch_feedback004);
}else if(db>
=57 &
&
db<
=75) {
vioce_show.setImageResource(R.drawable.voicesearch_feedback005);
}else if(db>
=76 &
&
db<
=94) {
vioce_show.setImageResource(R.drawable.voicesearch_feedback006);
}else if(db>
=95 &
&
db<
=100) {
vioce_show.setImageResource(R.drawable.voicesearch_feedback007);
}
}
}
【[Android]实现点击持续录音,松开结束录音,并实现随着分贝的大小改变图片】Dialog加载的XML页面实现
<
RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="90dp"
android:layout_marginTop="5dp"android:id="@+id/bianhua">
<
ImageView
android:id="@+id/vioce_show"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:src="https://www.songbingjia.com/android/@drawable/voicesearch_feedback001" />
<
TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="正在录音中"
android:gravity="center"
/>
<
/RelativeLayout>
主界面的试下
- activoti.xml
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > < Button android:id="@+id/speak" android:layout_width="wrap_content" android:layout_height="42dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:paddingLeft="10dp" android:layout_weight="0.62" android:background="@drawable/search_ba" android:drawableLeft="@drawable/speak_1" android:gravity="center" android:text="按住请讲话!!!" android:textSize="15sp" android:singleLine="true" android:visibility="gone" /> < /LinearLayout >
- MainActiovity.java实现
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activoti); send=(Button) findViewById(R.id.send); viocedomio=new VioceDomio(this); speak.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub CountingThreadextends thend=new CountingThreadextends(); if(event.getAction()==MotionEvent.ACTION_DOWN) {//如果按钮处于按下状态 //录音 if(!Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { Toast.makeText(ChatActivity.this, "SD not ", Toast.LENGTH_SHORT).show(); return false; } String sound_path=time_path+"sound.amr"; try{ soundfile=new File(Environment.getExternalStorageDirectory().getCanonicalFile()+"/bishevoice/"+sound_path); Log.d("send_filepath", Environment.getExternalStorageDirectory().getCanonicalFile()+"/bishevoice/"+sound_path); mmedio=new MediaRecorder(); mmedio.setAudiosource(MediaRecorder.AudioSource.MIC); mmedio.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mmedio.setOutputFile(soundfile.getAbsolutePath()); mmedio.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try{ //创建文件,准备录制 soundfile.createNewFile(); mmedio.prepare(); }catch(IllegalStateExceptione) { e.printStackTrace(); }//开始录制 thend.start(); mmedio.start(); speak.setText("松开停止录音"); viocedomio.showRecordingDialog(); //显示录音的大小finalHandler mHandler = new Handler() { @Override public void handleMessage(Message msg) { viocedomio.ChangeRecordingDialog(Double.parseDouble(msg.obj.toString())); } }; new Thread(new Runnable() {//启动线程根据改变录音显示大小 @Override public void run() { // TODO Auto-generated method stub while(mmedio!=null) {double ratio = (double)mmedio.getMaxAmplitude() ; double db = 0; // 分贝 if (ratio > 1) db = 20 * Math.log10(ratio); // Log.d(TAG,分贝值:+db); // mHandler.postDelayed(mUpdateMicStatusTimer, SPACE); Message msg=new Message(); msg.obj=db; mHandler.sendMessage(msg); } } }).start(); }catch(Exception e) { e.printStackTrace(); } }if(event.getAction()==MotionEvent.ACTION_UP) {//如果是松开 if(soundfile != null & & soundfile.exists()) {//停止录音 try { mmedio.setOnErrorListener(null); mmedio.setOnInfoListener(null); mmedio.setPreviewDisplay(null); mmedio.stop(); thend.interrupt(); //timetask.cancel(); }catch(Exception e) { Log.i("Exception", Log.getStackTraceString(e)); }mmedio.release(); mmedio=null; speak.setText("按住请讲话!!!"); String content=""; if(content.isEmpty()) { viocedomio.HideRecordingDialog(); //隐藏录音标志 Msg msg=new Msg(content,Msg.TYPE_SENT,Msg.TYPE_SENT_VOICE,Integer.toString(time_int),file_path); msg.setChattype(0); msglist.add(msg); adapter.notifyDataSetChanged(); //当有新消息时,刷新listview中的显示msgListView.setSelection(msglist.size()-1); //将listview定位到最后一行 } }} return true; } });
推荐阅读
- [译]Kubernetes 分布式应用部署和人脸识别 app 实例
- app优化篇
- Android 发送邮件以及定时发送邮件的实现
- 13最新安卓Xamarin绑定相关填坑之旅
- 自定义广播(BroadcastReceiver)事件 --Android开发
- 6.移动端App安装包的测试用例
- Go语言中利用append巧妙的删除slice切片中的元素
- 5.移动终端App测试点归纳
- Android初学第77天