錄音代碼寫完之后,開始測試
測試錄音步驟:
步驟 | 結(jié)果 | 原因 |
---|---|---|
第一次啟動APP 獲取權(quán)限 | 第一次錄音失敗 | crash之后岭佳,錄音通道被釋放 |
獲取權(quán)限(定位?錄音權(quán)限 | 第二次錄音正常 |
crash相關(guān)信息:發(fā)現(xiàn)第一次調(diào)用MediaRecorder.start()考抄,出現(xiàn)IllegalStateException蜕该。
具體Log如下:
以上信息不能準(zhǔn)確的發(fā)現(xiàn)出現(xiàn)問題的根本原因。
排除問題:
1.權(quán)限是否打開
AndroidManifest.xml 定義權(quán)限
checkPerMission
2.是否正常初始化:
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 設(shè)置麥克風(fēng)
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setOutputFile(mFilePath);
mMediaRecorder.setMaxDuration(MAX_LENGTH);
mMediaRecorder.prepare();
mMediaRecorder.start();
3.資源是否正常釋放:
mMediaRecorder.setOnErrorListener(null);
mMediaRecorder.setOnInfoListener(null);
mMediaRecorder.setPreviewDisplay(null);
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
4.打印更多的log剖毯,比如start failed:-xx類型的log圾笨?
01-21 16:08:28.675 E/MediaRecorder( 4722): start failed: -38
查閱資源發(fā)現(xiàn),-38代表麥克風(fēng)通道被占用逊谋。
通道占用判斷方法
private boolean validateMicAvailability(){
Boolean available = true;
AudioRecord recorder =
new AudioRecord(MediaRecorder.AudioSource.MIC, 44100,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_DEFAULT, 44100);
try{
if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED ){
available = false;
}
recorder.startRecording();
if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING){
recorder.stop();
available = false;
}
recorder.stop();
} finally{
recorder.release();
recorder = null;
}
return available;
}
返回true就是沒有被占用擂达。
返回false就是被占用。
調(diào)用完validateMicAvailability方法之后胶滋,Micro通道已經(jīng)被釋放板鬓,其他模塊即可以使用麥克風(fēng)悲敷。
根本原因:
1.由于項目中還引用了科大訊飛離線版語音模塊,語音模塊初始化成功之后俭令,離線喚醒功能開啟之后后德,默認(rèn)打開語音權(quán)限,即占用語音通道抄腔。所以導(dǎo)致錄音功能無法正常使用瓢湃。
2.如果項目既想錄音功能存在,又想使用語音模塊赫蛇,那么同一時刻只能使用一個绵患。比如當(dāng)需要錄音時,主動關(guān)閉語音模塊悟耘,當(dāng)錄音完成之后藏雏,主動初始化語音模塊。