/** 判断麦克风是有效,有效返回true,否则返回false */
fun validateMicAvailability(): Boolean {
var available = false
val recorder = AudioRecord(
MediaRecorder.AudioSource.MIC, 44100,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_DEFAULT, 44100
)
try {
Timber.i("麦克风当前状态:${recorder.recordingState}")
// 使用MediaRecorder正在录音时,调用此方法发现状态也是停止状态,
// 所以这个状态不可信,具体还是要看能否启动录音来判断
recorder.startRecording() // 即使麦克风被占用,这里调用也不会抛异常。但如果没被占用,则录制状态会变成AudioRecord.RECORDSTATE_RECORDING
Timber.i("调用录制后麦克风当前状态:${recorder.recordingState}")
if (recorder.recordingState == AudioRecord.RECORDSTATE_RECORDING) {
available = true
Timber.i("麦克风开始录制,没有被占用")
} else {
Timber.i("麦克风没有开始录制,说明被占用")
}
} catch (e: Exception) {
Timber.e(e, "发生异常了,应该是麦克风被占用了")
} finally {
recorder.release()
}
return available
}
=======================================================================
什么扬声器还能被占用?对于麦克风被占用应该很多人是知道的,但是很多人不知道扬声器也会被占用,在搜索这个知识点的时候就会发现找不到答案,因为开发这一块的相比录音这一块的要少的多。当我们打电话时,扬声器或者说听筒就会被占用,你此时放音乐肯定是没有声音的。
公司里有个项目用到了一个开源框架,已经实现了语音通话功能,领导希望实现按一下手机的一个按键实现禁止说话,再按一下又可以说话,这只是对于自己是否可以说话,但是听是一直都可以听的,就像使用对讲机一样,有时候,你不看屏幕的话,你不知道当前是否打开了说话的开关,所以希望在按这个开关键的时候发出提示音,开是一个提示音,关又是另一个提示音,这样即使不看屏幕的显示状态也能知道当前的说话开关状态是开还是关,看似很简单的功能,不就是播放两个提示音嘛,我三下两除二就把代码写好了,但是用到项目中时发现提示音并没有发出声响来,刚开始以为代码有问题,后来才知道原来扬声器也会被占用的,当语音通话的时候,声音类型是设置成了通话类型的,只要设置成了通话类型,自动就会给你占用扬声器,避免语音时还能听到别的软件发出来的声音,后来试过把声音类型改成Music,问题解决,但是仔细想想,人家系统既然设置通话类型应该占用扬声器,肯定是有一定的道理的,语音通话了,就不应该让音乐播放器发出声音,后来在同事的提醒下解决了问题,所以说同事之间的交流还是很有必要的。
解决方案: