package com.fuban.driver.utils;
|
|
import android.content.Context;
|
import android.media.MediaPlayer;
|
import android.media.MediaRecorder;
|
import android.net.Uri;
|
import android.os.Environment;
|
import android.os.Handler;
|
import android.util.Log;
|
|
import java.io.File;
|
import java.io.IOException;
|
|
import cn.sinata.xldutils.utils.TimeUtils;
|
|
public class AudioRecoderUtils {
|
|
//文件路径
|
private String filePath;
|
//文件夹路径
|
private String FolderPath;
|
|
private MediaRecorder mMediaRecorder;
|
private final String TAG = "fan";
|
public static final int MAX_LENGTH = 1000 * 60;// 最大录音时长1000*60*10;
|
|
private OnAudioStatusUpdateListener audioStatusUpdateListener;
|
private MediaPlayer mMediaPlayer;
|
|
/**
|
* 文件存储默认sdcard/record
|
*/
|
public AudioRecoderUtils() {
|
//默认保存路径为/sdcard/record/下
|
this(Environment.getExternalStorageDirectory() + "/record/");
|
}
|
|
public AudioRecoderUtils(String filePath) {
|
|
File path = new File(filePath);
|
if (!path.exists())
|
path.mkdirs();
|
|
this.FolderPath = filePath;
|
}
|
|
private long startTime;
|
private long endTime;
|
|
|
/**
|
* 开始录音 使用amr格式
|
* 录音文件
|
*
|
* @return
|
*/
|
public void startRecord() {
|
// 开始录音
|
/* ①Initial:实例化MediaRecorder对象 */
|
if (mMediaRecorder == null)
|
mMediaRecorder = new MediaRecorder();
|
try {
|
/* ②setAudioSource/setVedioSource */
|
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
|
/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
|
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
|
/*
|
* ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
|
* ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
|
*/
|
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
|
|
filePath = FolderPath + TimeUtils.getCurrentTime() + ".caf";
|
/* ③准备 */
|
mMediaRecorder.setOutputFile(filePath);
|
mMediaRecorder.setMaxDuration(MAX_LENGTH);
|
mMediaRecorder.prepare();
|
/* ④开始 */
|
mMediaRecorder.start();
|
// AudioRecord audioRecord.
|
/* 获取开始时间* */
|
startTime = System.currentTimeMillis();
|
updateMicStatus();
|
Log.e("fan", "startTime" + startTime);
|
} catch (IllegalStateException e) {
|
Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage());
|
} catch (IOException e) {
|
Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage());
|
}
|
}
|
|
/**
|
* 停止录音
|
*/
|
public long stopRecord() {
|
if (mMediaRecorder == null)
|
return 0L;
|
endTime = System.currentTimeMillis();
|
|
//有一些网友反应在5.0以上在调用stop的时候会报错,翻阅了一下谷歌文档发现上面确实写的有可能会报错的情况,捕获异常清理一下就行了,感谢大家反馈!
|
try {
|
mMediaRecorder.stop();
|
mMediaRecorder.reset();
|
mMediaRecorder.release();
|
mMediaRecorder = null;
|
|
audioStatusUpdateListener.onStop(filePath);
|
filePath = "";
|
|
} catch (RuntimeException e) {
|
if (mMediaRecorder != null) {
|
mMediaRecorder.reset();
|
mMediaRecorder.release();
|
mMediaRecorder = null;
|
}
|
File file = new File(filePath);
|
if (file.exists())
|
file.delete();
|
|
filePath = "";
|
|
}
|
return endTime - startTime;
|
}
|
|
public String getFilePath() {
|
return filePath;
|
}
|
|
/**
|
* 取消录音
|
*/
|
public void cancelRecord() {
|
|
try {
|
|
mMediaRecorder.stop();
|
mMediaRecorder.reset();
|
mMediaRecorder.release();
|
mMediaRecorder = null;
|
|
} catch (RuntimeException e) {
|
mMediaRecorder.reset();
|
mMediaRecorder.release();
|
mMediaRecorder = null;
|
}
|
File file = new File(filePath);
|
if (file.exists())
|
file.delete();
|
|
filePath = "";
|
|
}
|
|
private final Handler mHandler = new Handler();
|
private Runnable mUpdateMicStatusTimer = new Runnable() {
|
public void run() {
|
updateMicStatus();
|
}
|
};
|
|
|
private int BASE = 1;
|
private int SPACE = 100;// 间隔取样时间
|
|
public void setOnAudioStatusUpdateListener(OnAudioStatusUpdateListener audioStatusUpdateListener) {
|
this.audioStatusUpdateListener = audioStatusUpdateListener;
|
}
|
|
/**
|
* 更新麦克状态
|
*/
|
private void updateMicStatus() {
|
|
if (mMediaRecorder != null) {
|
double ratio = (double) mMediaRecorder.getMaxAmplitude() / BASE;
|
double db = 0;// 分贝
|
if (ratio > 1) {
|
db = 20 * Math.log10(ratio);
|
if (null != audioStatusUpdateListener) {
|
audioStatusUpdateListener.onUpdate(db, System.currentTimeMillis() - startTime);
|
}
|
}
|
mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);
|
}
|
}
|
|
public interface OnAudioStatusUpdateListener {
|
/**
|
* 录音中...
|
*
|
* @param db 当前声音分贝
|
* @param time 录音时长
|
*/
|
public void onUpdate(double db, long time);
|
|
/**
|
* 停止录音
|
*
|
* @param filePath 保存路径
|
*/
|
public void onStop(String filePath);
|
|
public void onStartPlay();
|
|
public void onFinishPlay();
|
}
|
|
//开始播放录音
|
public void startplayMusic(Context context, String filePath) {
|
if (mMediaPlayer != null) {
|
stopPlayMusic();
|
}
|
mMediaPlayer = new MediaPlayer();
|
try {
|
Log.e("mmp", "path:" + filePath);
|
mMediaPlayer.setDataSource(context, Uri.parse(filePath));
|
mMediaPlayer.prepareAsync();
|
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
|
@Override
|
public void onPrepared(MediaPlayer mp) {
|
// 装载完毕回调
|
mMediaPlayer.start();
|
if (audioStatusUpdateListener != null)
|
audioStatusUpdateListener.onStartPlay();
|
}
|
});
|
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
|
@Override
|
public void onCompletion(MediaPlayer mp) {
|
if (audioStatusUpdateListener != null)
|
audioStatusUpdateListener.onFinishPlay();
|
stopPlayMusic();
|
// BaseEvent baseEvent = new BaseEvent(BaseEvent.SEND_AODIO_PLAY_OVER);
|
// baseEvent.setMsg(filePath);
|
// EventBus.getDefault().post(baseEvent);
|
}
|
});
|
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
//结束录音播放
|
public void stopPlayMusic() {
|
if (mMediaPlayer == null)
|
return;
|
try {
|
mMediaPlayer.stop();
|
mMediaPlayer.release();
|
if (audioStatusUpdateListener != null)
|
audioStatusUpdateListener.onFinishPlay();
|
mMediaPlayer = null;
|
} catch (IllegalStateException e) {
|
e.printStackTrace();
|
}
|
}
|
|
/**
|
* 获取文件长度
|
*
|
* @param context
|
* @param filePath
|
* @return
|
*/
|
public int getMusicTime(Context context, String filePath) {
|
if (mMediaPlayer != null) {
|
stopPlayMusic();
|
}
|
mMediaPlayer = new MediaPlayer();
|
try {
|
mMediaPlayer.setDataSource(context, Uri.parse(filePath));
|
mMediaPlayer.prepare();
|
int duration = mMediaPlayer.getDuration();
|
if (0 != duration) {
|
mMediaPlayer.release();
|
return duration / 1000;
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
return 0;
|
}
|
|
}
|