正常初始化AudioRecord后的startRecording() called on an uninitialized AudioRecord异常
在使用AudioRecord的过程中,遇到一次情况。在如下正确初始化AudioRecord后,
final int minBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
调用
if(null != audioRecord){
audioRecord.startRecording();
}
报startRecording() called on an uninitialized 异常。经过排查后。发现是由于AudioRecord初始化中的第三个参数:AudioFormat.CHANNEL_IN_MONO引起的。
new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
但由于业务需要以及AudioFormat.CHANNEL_CONFIGURATION_MONO属性已经过时,遂采用方法 audioRecord.getState() == AudioRecord.STATE_UNINITIALIZED 来判断 audioRecord 是否成功初始化。来保证系统的兼容性。最终代码为:
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
if(audioRecord.getState() == AudioRecord.STATE_UNINITIALIZED){
Logger.e(TAG, " audioRecord init fail , Try another possibility ");
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
if(audioRecord.getState() == AudioRecord.STATE_UNINITIALIZED){
Logger.e(TAG, " audioRecord init fail twice, Try another possibility ");
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ / 2,
AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
}
}
暂时没发现有什么问题。等待测试反馈。