软件编程
位置:首页>> 软件编程>> Android编程>> Android仿微信录制语音功能

Android仿微信录制语音功能

作者:L代码  发布时间:2022-10-18 15:54:18 

标签:Android,微信,录制语音

本文实例为大家分享了Android仿微信录制语音的具体代码,供大家参考,具体内容如下

前言

我把录音分成了两部分

1.UI界面,弹窗读秒
2.一个类(包含开始、停止、创建文件名功能)

第一部分

由于6.0权限问题,点击按钮申请权限通过则弹窗,如何申请权限

弹窗布局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>

弹弹弹


/**
  * 开始录音
  */
 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, 0);

}

第二部分 工具类


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";
   }
}

这是从我代码中择出来的,加上权限应该是可以的。

来源:https://blog.csdn.net/qq_34882418/article/details/81346299

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com