录音管理类:AudioManger.java
负责创建录音文件,初始化录音,获取音量大小,开始录音,结束录音,释放资源等。
/**
* Created by qianye on 2016/8/30.
*/
public class AudioManger {
private MediaRecorder mMediaRecorder;
private String mDir;
private String mCurrentFilePath;
private static AudioManger mInstance;
private boolean isPrepared;
//Recorder准备好录音后的回调
public interface AudioStateListener {
void wellPrepared();
}
public AudioStateListener mListener;
public void setOnAudioStateListener(AudioStateListener Listener) {
this.mListener = Listener;
}
//单例模式
public static AudioManger getInstance(String dir) {
if (mInstance == null) {
synchronized (AudioManger.class) {
if (mInstance == null) {
mInstance = new AudioManger(dir);
}
}
}
return mInstance;
}
//构造器 参数: 录音文件夹
private AudioManger(String dir) {
mDir = dir;
}
//准备录音
public void prepareAudio() {
try {
isPrepared = false;
//在录音目录下建立录音文件
File dir = new File(mDir);
if (!dir.exists()) {
dir.mkdirs();
}
String fileName = generateFileName();
File file = new File(dir, fileName);
mCurrentFilePath = file.getAbsolutePath();
mMediaRecorder = new MediaRecorder();
//设置输出文件
mMediaRecorder.setOutputFile(mCurrentFilePath);
//设置音频源为麦克风
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置音频格式api>=10使用amr_nb 小于10使用raw_amr
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
//设置音频的编码为amr
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//准备录制
mMediaRecorder.prepare();
//准备好录制
isPrepared = true;
if (mListener != null) {
mListener.wellPrepared();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
if (isPrepared) {
//开始录制
mMediaRecorder.start();
}
}
//随机生成文件名称
private String generateFileName() {
return System.currentTimeMillis() + ".amr";
}
//获取音量大小 maxLevel为最大等级
public int getVoiceLevel(int maxLevel) {
if (isPrepared) {
try {
//mMediaRecorder.getMaxAmplitude() 1-32767
return maxLevel * mMediaRecorder.getMaxAmplitude() / 32768 + 1;
} catch (Exception e) {
}
}
return 1;
}
public void release() {
if (mMediaRecorder != null) {
mMediaRecorder.stop();
mMediaRecorder.release();
mMediaRecorder = null;
}
}
public void cancel() {
release();
//如果取消就删除生成的录音文件
if (mCurrentFilePath != null) {
File file = new File(mCurrentFilePath);
file.delete();
mCurrentFilePath = null;
}
}
public String getCurrentFilePath() {
return mCurrentFilePath;
}
}
自定义录音view:继承了ImageView
使用就和正常的ImageView一样
RecordView.java
/**
* Created by qianye on 2017/4/6.
*/
public class RecordView extends ImageView implements AudioManger.AudioStateListener {
private AudioManger audioManger;
private boolean isRecording = false;//是否正在录制
private boolean tooShort = false;//是否时间过短
private int time = 0;
private Handler handler;
private int MaxVoice = 14;//默认音量等级
private int MAXTIME = 90;
private boolean isPrepared = false;
public RecordView(Context context) {
this(context, null);
Log.i("LHD", "RecordView 1");
}
public RecordView(Context context, AttributeSet attrs) {
super(context, attrs);
Log.i("LHD", "RecordView 2");
String dir = Environment.getExternalStorageDirectory() + "/audios";
audioManger = AudioManger.getInstance(dir);
audioManger.setOnAudioStateListener(this);
handler = new Handler();
audioManger.prepareAudio();
}
//audio准备后之后开始录音的回调
@Override
public void wellPrepared() {
Log.i("LHD", "wellPrepared");
isRecording = false;
time = 0;
tooShort = false;
isPrepared = true;
}
public void start() {
if (!isPrepared) {
audioManger.prepareAudio();
}
audioManger.start();
isRecording = true;
//更新音量
handler.post(runnable);
}
public void stop() {
if (time <= 30) {
audioRecordListener.tooShort();
} else {
//回调
audioRecordListener.finish(time, audioManger.getCurrentFilePath());
}
//正常结束
audioManger.release();
isPrepared = false;
reset();
}
//接口回调
public interface AudioRecordListener {
//已经录制的时间
void hasRecord(int seconds);
//录制完成
void finish(int seconds, String filePath);
//时间太短
void tooShort();
//音量大小 根据设置的最大音量返回当前音量值
void curVoice(int voice);
}
private AudioRecordListener audioRecordListener;
public void setOnAudioRecordListener(AudioRecordListener listener) {
audioRecordListener = listener;
}
Runnable runnable = new Runnable() {
@Override
public void run() {
if (isRecording) {
time++;
audioRecordListener.hasRecord(time);
audioRecordListener.curVoice(audioManger.getVoiceLevel(MaxVoice));
handler.postDelayed(this, 100);
}
}
};
//置位
private void reset() {
isRecording = false;
time = 0;
tooShort = false;
handler.removeCallbacks(runnable);
}
//get set 方法
public void setMaxVoice(int maxVoice) {
MaxVoice = maxVoice;
}
public int getMaxVoice() {
return MaxVoice;
}
}
使用:
imgStart.setMaxVoice(16);
imgStart.setOnAudioRecordListener(new RecordView.AudioRecordListener() {
@Override
public void hasRecord(int seconds) {
//已经录制的时间
}
@Override
public void finish(int seconds, String filePath) {
//录制时间 注意此处单位是ms,如果需要修改成s可直接修改代码
}
@Override
public void tooShort() {
//小于3s显示时间过短
}
@Override
public void curVoice(int voice) {
//当前的音量等级
}
});
具体使用可参考我的另一篇博客:
自定义view实现录音功能,圆形进度条 - 秦时明月 - 博客频道 - CSDN.NET
http://blog.csdn.net/baidu_31093133/article/details/72768144
demo下载:
自定义view 录音 圆形进度条 - 下载频道 - CSDN.NET
http://download.csdn.net/detail/baidu_31093133/9853071