• MediaRecorder实现录音


    实现一个录音弹窗 按住说话。松开停止。。点击完成保存

     

    Dialog代码

    1. package com.runjiang.cityplatform.ui.dialog;
    2. import android.annotation.SuppressLint;
    3. import android.app.Dialog;
    4. import android.content.Context;
    5. import android.media.MediaRecorder;
    6. import android.os.Bundle;
    7. import android.view.MotionEvent;
    8. import android.view.View;
    9. import android.widget.ImageView;
    10. import android.widget.TextView;
    11. import androidx.annotation.NonNull;
    12. import com.runjiang.cityplatform.R;
    13. import java.io.File;
    14. public class SoundRecordDialog extends Dialog {
    15. private Context mContext;
    16. private MediaRecorder mr;
    17. private String cacheFilePath;
    18. private OnCompleteClickListen mOnCompleteClickListen;
    19. public SoundRecordDialog(@NonNull Context context,OnCompleteClickListen listen) {
    20. super(context);
    21. this.mContext=context;
    22. this.mOnCompleteClickListen=listen;
    23. }
    24. @SuppressLint({"MissingInflatedId", "LocalSuppress"})
    25. @Override
    26. protected void onCreate(Bundle savedInstanceState) {
    27. super.onCreate(savedInstanceState);
    28. setContentView(R.layout.dialog_sound_record);
    29. ImageView iv_sound_record= findViewById(R.id.iv_sound_record);
    30. TextView tv_status= findViewById(R.id.tv_status);
    31. TextView tv_finish= findViewById(R.id.tv_finish);
    32. // 手势操作处理
    33. iv_sound_record.setOnTouchListener(new View.OnTouchListener() {
    34. @SuppressLint("ClickableViewAccessibility")
    35. @Override
    36. public boolean onTouch(View v, MotionEvent event) {
    37. if (event.getAction() == MotionEvent.ACTION_DOWN)
    38. iv_sound_record.setBackgroundResource(R.mipmap.icon_sound_record_blue);
    39. tv_status.setText("录音中...");
    40. startRecord();
    41. if (event.getAction() == MotionEvent.ACTION_UP) {
    42. iv_sound_record.setBackgroundResource(R.mipmap.icon_sound_record_green);
    43. tv_status.setText("按住说话");
    44. stopRecord();
    45. }
    46. return true;
    47. }
    48. });
    49. tv_finish.setOnClickListener(v -> {
    50. if (null!=mOnCompleteClickListen){
    51. mOnCompleteClickListen.onComplete(cacheFilePath);
    52. }
    53. });
    54. }
    55. boolean isRecording = false;
    56. public void startRecord(){
    57. if(mr==null){
    58. mr = new MediaRecorder();
    59. File savePath= null;
    60. try {
    61. File file = new File(mContext.getExternalCacheDir(),"sounds");
    62. if (!file.exists()){
    63. file.mkdir();
    64. }
    65. savePath = new File(cacheFilePath=file.getAbsolutePath()+File.separator+System.currentTimeMillis()+".mp4");
    66. } catch (Exception e) {
    67. e.printStackTrace();
    68. }
    69. mr.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置录音的输入源
    70. mr.setOutputFile(savePath.getAbsolutePath()); // 设置输出文件名
    71. mr.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 设置输出格式
    72. mr.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 设置编码格式-AAC电脑能直接播放
    73. try{
    74. mr.prepare();
    75. mr.start();
    76. isRecording = true;
    77. // Log.e("录音文件名",savePath.getAbsolutePath());
    78. } catch(Exception e){
    79. e.printStackTrace();
    80. }
    81. }
    82. }
    83. public void stopRecord(){
    84. if(mr!= null){
    85. if (isRecording)
    86. mr.stop();
    87. mr.reset();
    88. mr.release();
    89. mr = null;
    90. }
    91. }
    92. private OnCompleteClickListen listener;
    93. public void setOnCompleteClickListen(OnCompleteClickListen onCompleteClickListen){
    94. listener=onCompleteClickListen;
    95. }
    96. /**
    97. * 设置确定取消按钮的回调
    98. */
    99. public interface OnCompleteClickListen {
    100. void onComplete(String path);
    101. }
    102. @Override
    103. public void onDetachedFromWindow() {
    104. super.onDetachedFromWindow();
    105. stopRecord();
    106. }
    107. }

    2.调用及销毁

    1. SoundRecordDialog mSrd;
    2. private void showSoundRecordDialog(){
    3. if (null!=mSrd && mSrd.isShowing()){
    4. return;
    5. }
    6. mSrd=new SoundRecordDialog(this, new SoundRecordDialog.OnCompleteClickListen() {
    7. @Override
    8. public void onComplete(String path) {
    9. mSrd.dismiss();
    10. if (null==path || TextUtils.isEmpty(path)){
    11. return;
    12. }
    13. // Log.e("点击完成",path);
    14. file=new File(path);
    15. uploadFileToServer(AUDIO);
    16. }
    17. });
    18. mSrd.show();
    19. }
    20. @Override
    21. protected void onDestroy() {
    22. if (null!=mSrd){
    23. mSrd.dismiss();
    24. mSrd=null;
    25. }
    26. }

    3.布局文件

    1. "1.0" encoding="utf-8"?>
    2. <androidx.appcompat.widget.LinearLayoutCompat
    3. xmlns:android="http://schemas.android.com/apk/res/android"
    4. android:layout_width="250dp"
    5. android:layout_height="250dp"
    6. android:gravity="center"
    7. android:background="@drawable/shape_rec_c15all"
    8. android:orientation="vertical">
    9. <ImageView
    10. android:id="@+id/iv_sound_record"
    11. android:layout_width="100dp"
    12. android:layout_height="100dp"
    13. android:background="@mipmap/icon_sound_record_green"/>
    14. <TextView
    15. android:id="@+id/tv_status"
    16. android:layout_marginTop="10dp"
    17. android:layout_width="wrap_content"
    18. android:layout_height="wrap_content"
    19. android:text="按住说话"/>
    20. <TextView
    21. android:id="@+id/tv_finish"
    22. android:layout_marginTop="30dp"
    23. android:layout_width="180dp"
    24. android:layout_height="45dp"
    25. android:background="@color/main_color"
    26. android:gravity="center"
    27. android:textColor="@color/white"
    28. android:text="完成"/>
    29. androidx.appcompat.widget.LinearLayoutCompat>

    4.ui效果

  • 相关阅读:
    数据结构 树 Tree
    Spring/SpringBoot中的声明式事务和编程式事务源码、区别、优缺点、适用场景、实战
    Nuxt3第二篇【路由】
    【MUDUO 】Channel通道
    异步电机控制算法更新列表
    Minio安装
    5.Eureka服务注册的源码分析(springcloud)
    7天免登录和加入购物车逻辑
    SuperFarm 和 NFT.NYC 定制款赛车将开启兑换!
    质点动力学
  • 原文地址:https://blog.csdn.net/ulddfhv/article/details/128007753