对于刚刚接触MediaRecorder的小伙伴,其实有很多很苦恼的问题,例如下面的代码块,你就可能出错,而且这种错误不容易意识到:
MediaRecorder mMediaRecorder = new MediaRecorder(); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); try { mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); } catch (Exception e) { e.printStackTrace(); }
错误来源:定义MediaRecorder的AudioSource、OutputFormat以及AudioEncorder三个属性的顺序和以上代码顺序不一样,这时就会报错。
// 开始录音 mMediaRecorder.setOutputFile(file.getAbsolutePath()); try { mMediaRecorder.prepare(); mMediaRecorder.start(); } catch (IOException e) { e.printStackTrace(); } ... //停止录音,释放资源 mMediaRecorder.stop(); mMediaRecorder.reset(); mMediaRecorder.release();
错误来源:当调用release()方法时,JNI中的native方法已经将资源释放,同时mMediaRecorder已经指向了空指针,但是Java代码中,它仍然不为空(通过mMediaRecorder==null判断就知道),然后你会发现每次代码执行到prepare()方法时,程序就会崩溃,这是logcat还不会报错,你会很郁闷,本人也是多番实验以及翻阅资料以及度娘才知道的问题所在,这时候你需要重新设置MediaRecorder的三个属性,也就是第一个代码块的代码要重新执行一遍。结论就是:每次开始录音都需要初始化所有资源,每次录音完毕,都释放所有资源。