package com.andbase.im.util; import java.io.File; import android.content.Context; import android.media.MediaRecorder; import android.util.Log; import com.ab.util.AbFileUtil; public class IMRecorder { private static final String TAG = IMRecorder.class.getSimpleName(); private Context context; /**SD卡未找到的错误码*/ private static final int SD_NOT_FOUND = 404; private static final String SD_NOT_FOUND_MSG = "SD卡未找到"; private static final int CREATE_FILE_ERROR = 500; private static final String CREATE_FILE_ERROR_MSG = "创建文件失败"; /** 默认音频下载文件地址. */ private static String downPathAudioFileDir = null; private IMRecordListener recordListener; private MediaRecorder mediaRecord = null; /** 准备录音 */ private boolean isPreRecording = false; /** 正在录音 */ private boolean isRecording = false; private boolean isCancel = false; private File audioFile; private String fileName = null; private long startRecordTime = 0; public IMRecorder(Context context, IMRecordListener recordListener) { this.recordListener = recordListener; this.context = context; } /** * 开始录音 */ public void startRecording() { //录音的文件类型 String AMR_FILE = ".amr"; if (isPreRecording || isRecording){ return; } if(fileName == null){ fileName = System.currentTimeMillis()+AMR_FILE; } if(!AbFileUtil.isCanUseSD()){ recordListener.onError(SD_NOT_FOUND, SD_NOT_FOUND_MSG); return; } downPathAudioFileDir = AbFileUtil.getDownloadRootDir(context)+ File.separator+ "audio" + File.separator; audioFile = new File(downPathAudioFileDir+fileName); try{ if(!audioFile.getParentFile().exists()){ audioFile.getParentFile().mkdirs(); } if(!audioFile.exists()){ audioFile.createNewFile(); } }catch (Exception e1){ e1.printStackTrace(); recordListener.onError(CREATE_FILE_ERROR, CREATE_FILE_ERROR_MSG); } isPreRecording = true; //准备录音 recordListener.onPreRecording(); mediaRecord = new MediaRecorder(); mediaRecord.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecord.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); mediaRecord.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mediaRecord.setAudioSamplingRate(8000); mediaRecord.setAudioEncodingBitRate(24); mediaRecord.setOutputFile(audioFile.getPath()); long currTime = 0; try { //准备录音 Log.i(TAG, "准备录音"); currTime = System.currentTimeMillis(); mediaRecord.prepare(); Log.i(TAG, "准备消耗时间:" + String.valueOf(System.currentTimeMillis() - currTime)); } catch (Exception e) { e.printStackTrace(); return; } startRecordTime = System.currentTimeMillis(); mediaRecord.start(); //准备录音 recordListener.onRecording(); Log.i(TAG, "开始消耗时间:" + String.valueOf(System.currentTimeMillis() - currTime)); Log.i(TAG, "开始录音"); isRecording = true; } /** * 停止录音 */ public void stopRecording(final boolean isCancel) { if(!isRecording){ return; } if(isCancel){ Log.i(TAG, "取消录音"); this.isCancel = isCancel; recordListener.onCancel(); }else{ Log.i(TAG, "停止录音"); mediaRecord.stop(); recordListener.onFinish(audioFile, System.currentTimeMillis()-startRecordTime); } isPreRecording = false; isRecording = false; fileName = null; } public String getFileName(){ return fileName; } public void setFileName(String fileName){ this.fileName = fileName; } }