简单是终极的复杂。 ——达·芬奇
权限:
RECORD_AUDIO
WRITE_EXTERNAL_STORAGE
步骤:
一.对控件(TextView)设置点击事件:setOnTouchListener。
textview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN: //按下
startRecord(); //开始录音函数
break;
case MotionEvent.ACTION_UP: //抬起
case MotionEvent.ACTION_CANCEL: //滑动 抬起
stopRecord(); //停止录音函数
break;
default:
break;
}
return true;
}
});
}
二.开始录音。
1.改变UI。
2.开启后台录音。(主函数初始化 ExecutorService executorService= Executors.newSingleThreadExecutor()//开启单线程)
executorService.submit(new Runnable() {
@Override
public void run() {
releaseRecorder(); //先释放之前的录音
if(!dostart()){ //录音函数
recordFail(); //失败提醒
}
}
});
3.录音。
三.停止录音。private boolean dostart() { try { //初始化mediaRecorder mmediarecorder=new MediaRecorder(); //创建录音文件 maudiofile=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/iMoocDemo/"+System .currentTimeMillis()+".m4a"); maudiofile.getParentFile().mkdirs(); maudiofile.createNewFile(); //麦克风采集 mmediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //保存文件为MP4格式 mmediarecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); //安卓系统都支持的采样频率 mmediarecorder.setAudioSamplingRate(44100); //通用的AAC编码格式 mmediarecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //音质比较好的频率 mmediarecorder.setAudioEncodingBitRate(96000); //录音文件的位置 mmediarecorder.setOutputFile(maudiofile.getAbsolutePath()); //开始录音 mmediarecorder.prepare(); mmediarecorder.start(); //统计时长 mstartrecordtime=System.currentTimeMillis(); } catch (IOException | RuntimeException e) { e.printStackTrace(); return false; } return true; }
1.改变UI(原始UI)。
2.开启后台停止录音。3.停止录音。executorService.submit(new Runnable() { @Override public void run() { if(!doStop()){ //停止录音函数 recordFail(); //停止失败提醒 } } }); releaseRecorder(); //释放MediaRecorder
private boolean doStop() { try { mmediarecorder.stop(); //停止 mstoprecordtime=System.currentTimeMillis(); //记录停止时间 final int second=(int)((mstoprecordtime-mstartrecordtime)/1000); //停止时间-开始时间=录音所用时间 if(second>3){ //只要录音时长超过3秒的 mmainthreadhander.post(new Runnable(){ @Override public void run() { mTvLog.setText(mTvLog.getText()+"\n录音成功"+second+"秒"); //显示录音成功 } }); } }catch (RuntimeException e){ e.printStackTrace(); return false; } return true; }
四.失败提醒函数。(在主线程初始化Android.os.Handler hander=new android.os.Handler(Looper.getMainLooper());//os库下的Handler,
Looper.getMainLooper为绑定主线程。不懂的,请访问Android中Handler的使用)
五.MediaRecorder释放函数。private void recordFail() { maudiofile=null; //录音文件设为空 mmainthreadhander.post(new Runnable(){ //用Handler的post返回主线程进行Toast提醒 @Override public void run() { Toast.makeText(FileActivity.this, "录音失败", Toast.LENGTH_SHORT).show(); } }); }
六.ExecutorService释放。private void releaseRecorder() { if(mmediarecorder!=null){ //如果不为空 mmediarecorder.release(); //释放 mmediarecorder=null; } }
protected void onDestroy() { super.onDestroy(); executorService.shutdownNow(); //立即释放 releaseRecorder(); //MediaRecorder释放 }