MediaRecorder中遇到的坑

对于刚刚接触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的三个属性,也就是第一个代码块的代码要重新执行一遍。结论就是:每次开始录音都需要初始化所有资源,每次录音完毕,都释放所有资源。

你可能感兴趣的:(异常处理,Android,android小技巧,录音)