实现一个录音弹窗 按住说话。松开停止。。点击完成保存
Dialog代码
- package com.runjiang.cityplatform.ui.dialog;
-
- import android.annotation.SuppressLint;
- import android.app.Dialog;
- import android.content.Context;
- import android.media.MediaRecorder;
- import android.os.Bundle;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.ImageView;
- import android.widget.TextView;
- import androidx.annotation.NonNull;
- import com.runjiang.cityplatform.R;
- import java.io.File;
-
- public class SoundRecordDialog extends Dialog {
- private Context mContext;
- private MediaRecorder mr;
- private String cacheFilePath;
- private OnCompleteClickListen mOnCompleteClickListen;
-
- public SoundRecordDialog(@NonNull Context context,OnCompleteClickListen listen) {
- super(context);
- this.mContext=context;
- this.mOnCompleteClickListen=listen;
- }
-
-
- @SuppressLint({"MissingInflatedId", "LocalSuppress"})
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.dialog_sound_record);
- ImageView iv_sound_record= findViewById(R.id.iv_sound_record);
- TextView tv_status= findViewById(R.id.tv_status);
- TextView tv_finish= findViewById(R.id.tv_finish);
- // 手势操作处理
- iv_sound_record.setOnTouchListener(new View.OnTouchListener() {
- @SuppressLint("ClickableViewAccessibility")
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_DOWN)
- iv_sound_record.setBackgroundResource(R.mipmap.icon_sound_record_blue);
- tv_status.setText("录音中...");
- startRecord();
- if (event.getAction() == MotionEvent.ACTION_UP) {
- iv_sound_record.setBackgroundResource(R.mipmap.icon_sound_record_green);
- tv_status.setText("按住说话");
- stopRecord();
- }
- return true;
- }
- });
-
-
- tv_finish.setOnClickListener(v -> {
- if (null!=mOnCompleteClickListen){
- mOnCompleteClickListen.onComplete(cacheFilePath);
- }
- });
- }
-
-
- boolean isRecording = false;
- public void startRecord(){
- if(mr==null){
- mr = new MediaRecorder();
- File savePath= null;
- try {
- File file = new File(mContext.getExternalCacheDir(),"sounds");
- if (!file.exists()){
- file.mkdir();
- }
- savePath = new File(cacheFilePath=file.getAbsolutePath()+File.separator+System.currentTimeMillis()+".mp4");
- } catch (Exception e) {
- e.printStackTrace();
- }
- mr.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置录音的输入源
- mr.setOutputFile(savePath.getAbsolutePath()); // 设置输出文件名
- mr.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 设置输出格式
- mr.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 设置编码格式-AAC电脑能直接播放
- try{
- mr.prepare();
- mr.start();
- isRecording = true;
- // Log.e("录音文件名",savePath.getAbsolutePath());
- } catch(Exception e){
- e.printStackTrace();
- }
- }
- }
-
-
- public void stopRecord(){
- if(mr!= null){
- if (isRecording)
- mr.stop();
- mr.reset();
- mr.release();
- mr = null;
- }
- }
-
- private OnCompleteClickListen listener;
- public void setOnCompleteClickListen(OnCompleteClickListen onCompleteClickListen){
- listener=onCompleteClickListen;
- }
-
-
- /**
- * 设置确定取消按钮的回调
- */
- public interface OnCompleteClickListen {
- void onComplete(String path);
- }
-
- @Override
- public void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- stopRecord();
- }
- }
2.调用及销毁
- SoundRecordDialog mSrd;
- private void showSoundRecordDialog(){
- if (null!=mSrd && mSrd.isShowing()){
- return;
- }
- mSrd=new SoundRecordDialog(this, new SoundRecordDialog.OnCompleteClickListen() {
- @Override
- public void onComplete(String path) {
- mSrd.dismiss();
- if (null==path || TextUtils.isEmpty(path)){
- return;
- }
- // Log.e("点击完成",path);
- file=new File(path);
- uploadFileToServer(AUDIO);
- }
- });
- mSrd.show();
- }
-
-
-
-
- @Override
- protected void onDestroy() {
- if (null!=mSrd){
- mSrd.dismiss();
- mSrd=null;
- }
- }
3.布局文件
- "1.0" encoding="utf-8"?>
- <androidx.appcompat.widget.LinearLayoutCompat
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="250dp"
- android:layout_height="250dp"
- android:gravity="center"
- android:background="@drawable/shape_rec_c15all"
- android:orientation="vertical">
-
-
- <ImageView
- android:id="@+id/iv_sound_record"
- android:layout_width="100dp"
- android:layout_height="100dp"
- android:background="@mipmap/icon_sound_record_green"/>
-
- <TextView
- android:id="@+id/tv_status"
- android:layout_marginTop="10dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="按住说话"/>
-
- <TextView
- android:id="@+id/tv_finish"
- android:layout_marginTop="30dp"
- android:layout_width="180dp"
- android:layout_height="45dp"
- android:background="@color/main_color"
- android:gravity="center"
- android:textColor="@color/white"
- android:text="完成"/>
-
- androidx.appcompat.widget.LinearLayoutCompat>
4.ui效果