Android imitation wechat voice recording function
This example shares the specific code of Android imitation wechat recording voice for your reference. The specific contents are as follows
preface
I divided the recording into two parts
1. UI interface, pop-up window to read seconds 2. A class (including start, stop and create file name functions)
Part I
Due to the 6.0 permission problem, click the button to apply for permission, and a window will pop up. How to apply for permission
Pop up window layout popw_ record.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="260dp" android:layout_marginLeft="50dp" android:layout_marginRight="50dp" android:background="@drawable/take_phone" android:orientation="vertical"> <ImageView android:id="@+id/close" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:padding="10dp" android:src="@mipmap/guanbi" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="50dp" android:layout_marginRight="50dp" android:gravity="center" android:orientation="vertical"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/luyin" /> <Chronometer android:id="@+id/timer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:format="%s" /> <TextView android:id="@+id/startRecord" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/playrecord" android:layout_marginTop="20dp" android:background="@color/background" android:padding="10dp" /> </LinearLayout> </RelativeLayout> </LinearLayout>
Bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce bounce
/** * 开始录音 */ private void showPopup() { final View contentView = LayoutInflater.from(Orderdeatil.this).inflate(R.layout.popw_record,null); mPopWindow = new PopupWindow(contentView,ActionBar.LayoutParams.MATCH_PARENT,ActionBar.LayoutParams.WRAP_CONTENT,true); mPopWindow.setContentView(contentView); TextView startRe = (TextView) contentView.findViewById(R.id.startRecord); startRe.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v,MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP://松开事件发生后执行代码的区域 if (mPopWindow != null) { mPopWindow.dismiss(); sr.stopRecording(); } break; case MotionEvent.ACTION_DOWN://按住事件发生后执行代码的区域 Chronometer timer = (Chronometer) contentView.findViewById(R.id.timer); timer.setBase(SystemClock.elapsedRealtime());//计时器清零 timer.start();//开始录音的提示 sr.startRecording(); break; case MotionEvent.ACTION_CANCEL: if (mPopWindow != null) { mPopWindow.dismiss(); sr.stopRecording();//停止录音 } break; default: break; } return true; } }); ImageView close = (ImageView) contentView.findViewById(R.id.close); close.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mPopWindow.dismiss(); } }); mPopWindow.setTouchable(true); mPopWindow.setFocusable(true); mPopWindow.setBackgroundDrawable(new BitmapDrawable()); mPopWindow.setOutsideTouchable(true); mPopWindow.setTouchInterceptor(new View.OnTouchListener() { public boolean onTouch(View v,MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { mPopWindow.dismiss(); return true; } return false; } }); View rootview = LayoutInflater.from(Orderdeatil.this).inflate(R.layout.activity_orderdeatil,null); mPopWindow.showAtLocation(rootview,Gravity.CENTER,0); }
Part II tools
class SoundRecorder { public void startRecording() { mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mRecorder.setOutputFile(newFileName()); try { // 准备好开始录音 mRecorder.prepare(); mRecorder.start(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void stopRecording() { if (mRecorder != null) { //added by ouyang start try { //下面三个参数必须加,不加的话会奔溃,在mediarecorder.stop(); //报错为:RuntimeException:stop Failed mRecorder.setOnErrorListener(null); mRecorder.setOnInfoListener(null); mRecorder.setPreviewDisplay(null); mRecorder.stop(); } catch (IllegalStateException e) { // TODO: handle exception Log.i("Exception",Log.getStackTraceString(e)); } catch (RuntimeException e) { // TODO: handle exception Log.i("Exception",Log.getStackTraceString(e)); } catch (Exception e) { // TODO: handle exception Log.i("Exception",Log.getStackTraceString(e)); } //added by ouyang end mRecorder.release(); mRecorder = null; upRecord(); } } public String newFileName() { mFileName = Environment.getExternalStorageDirectory() .getAbsolutePath(); String s = new SimpleDateFormat("yyyy-MM-dd hhmmss") .format(new Date()); return mFileName += "/rcd_" + s + ".mp3"; } }
This is selected from my code. It should be possible to add permissions.
The above is the whole content of this article. I hope it will help you in your study, and I hope you will support us a lot.