实现一个录音弹窗 按住说话。松开停止。。点击完成保存
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.布局文件
<?xml version="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效果