場(chǎng)景:項(xiàng)目仿照github上的一個(gè)ChatDemo( https://github.com/Maxi-Mao/ChatDemo ,給出鏈接感謝作者的開(kāi)源代碼對(duì)我項(xiàng)目的幫助!)中的代碼實(shí)現(xiàn)錄音功能,昨晚,發(fā)現(xiàn)項(xiàng)目中的錄音功能在首次使用時(shí)會(huì)彈出提示,提示用戶(hù)是否開(kāi)啟錄音權(quán)限.隨后點(diǎn)擊開(kāi)啟后,馬上就會(huì)提示錄音失敗,然后再錄音也會(huì)失敗!直到幾次后才會(huì)成功!如果直接點(diǎn)擊拒絕授予權(quán)限,則項(xiàng)目會(huì)直接崩潰.
分析:可能是由于點(diǎn)擊錄音的時(shí)候,沒(méi)有權(quán)限,導(dǎo)致android系統(tǒng)彈出提示窗,而在彈窗的同時(shí),錄音并沒(méi)有停止.而且錄音前缺少了權(quán)限的判斷才會(huì)出現(xiàn)上述問(wèn)題.
最后和同事嘗試了解決后,認(rèn)為解決方法還可以,決定分享給大家.
思路:在點(diǎn)擊錄音彈出權(quán)限彈窗前,先判斷是否開(kāi)啟錄音權(quán)限.如果沒(méi)有開(kāi)啟錄音權(quán)限,就開(kāi)啟一段虛擬(假錄音),這時(shí)就會(huì)彈出權(quán)限提示了.而真的錄音又沒(méi)有被觸發(fā),只有有權(quán)限后真的錄音才會(huì)被觸發(fā).這樣就完美的解決了以上問(wèn)題.
1)首先,定義一個(gè)返回boolean值得方法,判斷是否已經(jīng)開(kāi)啟錄音權(quán)限.
private boolean voicePermission(){
return (PackageManager.PERMISSION_GRANTED == ContextCompat.
checkSelfPermission(MyApplication.appContext, android.Manifest.permission.RECORD_AUDIO));
}
2)然后再開(kāi)始點(diǎn)擊錄音的時(shí)候?qū)懭?/p>
if (!voicePermission()){//沒(méi)有權(quán)限,自己寫(xiě)一段假的錄音代碼,這段錄音代碼其實(shí)無(wú)效.
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
recorder.setAudioChannels(1);
recorder.setAudioSamplingRate(8000);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.setOutputFile(DataURI.CreateTempFileName(""));//這里給個(gè)假的地址,因?yàn)檫@段錄音是無(wú)效的.
try {
recorder.prepare();
recorder.start();//要開(kāi)始錄音時(shí),這里就會(huì)彈出提示框了,如果不給權(quán)限.我們有異常處理,而且下次想錄音時(shí) 還是會(huì)有此提示.
recorder.stop();
recorder.release();
} catch (IOException e) {
e.printStackTrace();
}
return false;//這里是因?yàn)橥鈱訉邮且粋€(gè)長(zhǎng)按事件,返回false表示處理過(guò)了(OnLongClickListener).
}
......//上述代碼后 就是項(xiàng)目中真正的錄音代碼了.