package com.fanxin.easeui.model;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import com.hyphenate.EMError;
import com.hyphenate.chat.EMClient;
import com.hyphenate.util.EMLog;
import com.hyphenate.util.PathUtil;
import android.content.Context;
import android.media.MediaRecorder;
import android.os.Handler;
import android.os.SystemClock;
import android.text.format.Time;
public class EaseVoiceRecorder {
MediaRecorder recorder;
static final String PREFIX = "voice";
static final String EXTENSION = ".amr";
private boolean isRecording = false;
private long startTime;
private String voiceFilePath = null;
private String voiceFileName = null;
private File file;
private Handler handler;
public EaseVoiceRecorder(Handler handler) {
this.handler = handler;
}
/**
* start recording to the file
*/
public String startRecording(Context appContext) {
file = null;
try {
// need to create recorder every time, otherwise, will got exception
// from setOutputFile when try to reuse
if (recorder != null) {
recorder.release();
recorder = null;
}
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setAudioChannels(1); // MONO
recorder.setAudioSamplingRate(8000); // 8000Hz
recorder.setAudioEncodingBitRate(64); // seems if change this to
// 128, still got same file
// size.
// one easy way is to use temp file
// file = File.createTempFile(PREFIX + userId, EXTENSION,
// User.getVoicePath());
voiceFileName = getVoiceFileName(EMClient.getInstance().getCurrentUser());
voiceFilePath = PathUtil.getInstance().getVoicePath() + "/" + voiceFileName;
file = new File(voiceFilePath);
recorder.setOutputFile(file.getAbsolutePath());
recorder.prepare();
isRecording = true;
recorder.start();
} catch (IOException e) {
EMLog.e("voice", "prepare() failed");
}
new Thread(new Runnable() {
@Override
public void run() {
try {
while (isRecording) {
android.os.Message msg = new android.os.Message();
msg.what = recorder.getMaxAmplitude() * 13 / 0x7FFF;
handler.sendMessage(msg);
SystemClock.sleep(100);
}
} catch (Exception e) {
// from the crash report website, found one NPE crash from
// one android 4.0.4 htc phone
// maybe handler is null for some reason
EMLog.e("voice", e.toString());
}
}
}).start();
startTime = new Date().getTime();
EMLog.d("voice", "start voice recording to file:" + file.getAbsolutePath());
return file == null ? null : file.getAbsolutePath();
}
/**
* stop the recoding
*
* @return seconds of the voice recorded
*/
public void discardRecording() {
if (recorder != null) {
try {
recorder.stop();
recorder.release();
recorder = null;
if (file != null && file.exists() && !file.isDirectory()) {
file.delete();
}
} catch (IllegalStateException e) {
} catch (RuntimeException e){}
isRecording = false;
}
}
public int stopRecoding() {
if(recorder != null){
isRecording = false;
recorder.stop();
recorder.release();
recorder = null;
if(file == null || !file.exists() || !file.isFile()){
return EMError.FILE_INVALID;
}
if (file.length() == 0) {
file.delete();
return EMError.FILE_INVALID;
}
int seconds = (int) (new Date().getTime() - startTime) / 1000;
EMLog.d("voice", "voice recording finished. seconds:" + seconds + " file length:" + file.length());
return seconds;
}
return 0;
}
protected void finalize() throws Throwable {
super.finalize();
if (recorder != null) {
recorder.release();
}
}
private String getVoiceFileName(String uid) {
Time now = new Time();
now.setToNow();
return uid + now.toString().substring(0, 15) + EXTENSION;
}
public boolean isRecording() {
return isRecording;
}
public String getVoiceFilePath() {
return voiceFilePath;
}
public String getVoiceFileName() {
return voiceFileName;
}
}