您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

Android手机麦克风和扬声器被占用

时间:02-05来源:作者:点击数:

1、麦克风被占用

做过Android音视频开发的可能会碰到过这样的问题,在录音时,发现麦克风被占用,解决办法也很简单,给个提示说麦克风被占用即可,如何知道麦克风被占用呢?根据网上答案,原理就是开一个录音试试,如果不能录音,说明被占用了,代码如下:

/** 判断麦克风是有效,有效返回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
}

2、扬声器被占用

什么扬声器还能被占用?对于麦克风被占用应该很多人是知道的,但是很多人不知道扬声器也会被占用,在搜索这个知识点的时候就会发现找不到答案,因为开发这一块的相比录音这一块的要少的多。当我们打电话时,扬声器或者说听筒就会被占用,你此时放音乐肯定是没有声音的。

公司里有个项目用到了一个开源框架,已经实现了语音通话功能,领导希望实现按一下手机的一个按键实现禁止说话,再按一下又可以说话,这只是对于自己是否可以说话,但是听是一直都可以听的,就像使用对讲机一样,有时候,你不看屏幕的话,你不知道当前是否打开了说话的开关,所以希望在按这个开关键的时候发出提示音,开是一个提示音,关又是另一个提示音,这样即使不看屏幕的显示状态也能知道当前的说话开关状态是开还是关,看似很简单的功能,不就是播放两个提示音嘛,我三下两除二就把代码写好了,但是用到项目中时发现提示音并没有发出声响来,刚开始以为代码有问题,后来才知道原来扬声器也会被占用的,当语音通话的时候,声音类型是设置成了通话类型的,只要设置成了通话类型,自动就会给你占用扬声器,避免语音时还能听到别的软件发出来的声音,后来试过把声音类型改成Music,问题解决,但是仔细想想,人家系统既然设置通话类型应该占用扬声器,肯定是有一定的道理的,语音通话了,就不应该让音乐播放器发出声音,后来在同事的提醒下解决了问题,所以说同事之间的交流还是很有必要的。

解决方案:

既然语音时占用了扬声器,是你的应用在语音,那就是你的应用在占用扬声器,则我们可以在使用扬声器的地方去播放提示音即可,公司的项目是使用AudioTrack来播放来自网络的语音流的,它接收的是PCM数据的字节数组,所以我们就把提示音转换为PCM格式保存为文件,放在项目中,然后通过输入流读入内存,因为容量不算大,很短的语音,但也不算小,所以我不想每次播放时都读这个文件,所以我就使用了软引用,把文件读到字节数组后保存在软引用中,内存不足时可以回收,使用时先从软引用拿,拿不到再读文件,读到了又放入软引用中。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门