Android仿微信录制语音功能

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

本文实例为大家分享了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

标签:Android,微信,录制语音
0
投稿

猜你喜欢

  • C#调用WebService实例与开发教程(推荐)

    2023-10-24 19:01:43
  • c#日期间隔计算示例

    2022-11-28 07:49:48
  • Kotlin 匿名类实现接口和抽象类的区别详解

    2021-09-04 07:14:58
  • Java 方法签名详解及实例代码

    2022-02-04 05:56:06
  • IDEA:Git stash 暂存分支修改的实现代码

    2023-11-29 09:16:35
  • C#实现计算器窗体程序

    2023-04-09 01:25:42
  • java private关键字用法实例

    2022-01-16 10:08:06
  • 使用SpringBoot 工厂模式自动注入到Map

    2021-12-22 10:02:42
  • Java实现求数组最长子序列算法示例

    2023-09-28 12:35:14
  • Unity实现轮盘方式的按钮滚动效果

    2022-06-19 16:53:57
  • C语言实现通讯录小项目

    2022-10-05 07:33:36
  • Spring boot动态修改日志级别的方法

    2023-04-04 09:36:00
  • 详解Android通知栏沉浸式/透明化完整解决方案

    2023-09-06 03:59:11
  • C#获取两个数的最大公约数和最小公倍数示例

    2022-12-03 02:45:25
  • JDK动态代理,代理接口没有实现类,实现动态代理方式

    2021-12-21 11:55:22
  • Java 图表类库详解

    2021-11-09 00:25:11
  • Java毕业设计实战之共享租车信息管理系统的实现

    2022-08-02 13:37:32
  • Java实现按比抽奖功能

    2023-11-11 13:12:30
  • Mybatis多表关联查询的实现(DEMO)

    2022-05-03 14:50:03
  • Spring Security实现基于RBAC的权限表达式动态访问控制的操作方法

    2023-11-29 16:03:25
  • asp之家 软件编程 m.aspxhome.com