android实现语音;
第一步:设置权限
<!-- 语音权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
第二部:录音实现封装代码:
public class BaseRecorder extends MediaRecorder {
private static final String LOG_TAG = "BaseRecorder";
// private ObtainDecibelThread thread;
private Boolean flag = false;
private static final int MIN_INTERVAL_TIME = 2000;// 2s
private Dialog recordIndicator;
private static int[] res = { R.drawable.mic_2, R.drawable.mic_3,
R.drawable.mic_4, R.drawable.mic_5 };
private Context context;
private String fileName;
public BaseRecorder(Context context,String fileName){
this.context = context;
this.fileName = fileName;
setOutputFile(fileName);
setAudioSource(MediaRecorder.AudioSource.MIC);
setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
}
private static BaseRecorder recorder;
public static BaseRecorder getInstance(Context context,String fileName){
Log.d(LOG_TAG, "BaseRecorder getInstance()");
if(recorder != null){
recorder.release();
}
// if(recorder == null){
// recorder = new BaseRecorder(context,fileName);
// }else{
// recorder.reset();
// recorder.setOutputFile(fileName);
//
// }
return new BaseRecorder(context,fileName);
} ;
public void startRecording() {
Log.d(LOG_TAG, "start startRecording");
try {
prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
initDialogAndStartRecord();
Log.d(LOG_TAG, "end startRecording");
}
public void stopRecording() {
Log.d(LOG_TAG, "start stopRecording");
if (recordIndicator != null) {
recordIndicator.dismiss();
}
try {
stop();
release();
}catch (Exception e){
Log.d(LOG_TAG, "stop error",e);
}finally {
}
long intervalTime = System.currentTimeMillis() - startTime;
// System.out.println("fileName:"+fileName);
if (intervalTime < MIN_INTERVAL_TIME) {
Toast.makeText(context, "时间太短!", Toast.LENGTH_SHORT).show();
File file = new File(fileName);
file.delete();
if(recordCallBack != null){
recordCallBack.recordNoUse(fileName);
}
} else {
if(recordCallBack != null){
double seconds = (double)intervalTime/1000;
recordCallBack.recordSuccess(fileName,(int)seconds);
}
}
Log.d(LOG_TAG, "end stopRecording");
}
private long startTime;
private void initDialogAndStartRecord() {
Log.d(LOG_TAG, "starting record");
startTime = System.currentTimeMillis();
start();
}
@Override
public void release(){
Log.d(LOG_TAG, "start release()");
try {
super.release();
}catch (Exception e){
Log.e(LOG_TAG, " release failed");
}
Log.d(LOG_TAG, "end release()");
}
private RecordCallBack recordCallBack;
public RecordCallBack getRecordCallBack() {
return recordCallBack;
}
public void setRecordCallBack(RecordCallBack recordCallBack) {
this.recordCallBack = recordCallBack;
}
public interface RecordCallBack{
public void recordSuccess(String fileName,int seconds);
public void recordNoUse(String fileName);
}
}
第三部:实现语音播放
// 重新
private BaseRecorder.RecordCallBack recordCallBack = new BaseRecorder.RecordCallBack() {
@Override
public void recordSuccess(String fileName, int second) {
recorderFileName = fileName;
seconds = second;
updateRecordSecondsTV();
// linerlayout.setVisibility(View.VISIBLE);
}
@Override
public void recordNoUse(String fileName) {
recorderFileName = null;
updateRecordSecondsTV();
// linerlayout.setVisibility(View.INVISIBLE);
}
};
// 更新语言秒数
private void updateRecordSecondsTV() {
if (recorderFileName != null && seconds > 0) {
audioEntity = new AudioEntity();
audioEntity.setAudioPath(recorderFileName);
audioEntity.setAudioLength(seconds);
mAudioList.add(audioEntity);
mGVAudioAdapter.notifyDataSetChanged();
sCurrentAudioNum++;
} else {
}
}
// 获取当前时间的图片
private String generateFileName(String type) {
String fileName = "" + System.currentTimeMillis() + type;
return FileUtils.getCachePath("gen") + fileName;
}
//语音实现基本逻辑: