如何使用Android仿微信录制语音功能
创始人
2024-12-20 04:23:33
0次

具体内容如下

前言

我把录音分成了两部分

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

第一部分

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

弹窗布局popw_record.xml

                                 

弹弹弹

/**   * 开始录音   */  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";    }}

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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...