Android音频Channel切换

引言

Android手机在连接耳机的时候会自动切换音频通道,从原来的手机内置麦克风传输音频数据变成通过耳机进行音频的输入输出,那如果想要在连接耳机的情况下,自己手动选择手机内置的麦克风进行音频输入输出该怎么处理呢?本文将会给出具体可靠的解决方法。实现在蓝牙,耳机,扬声器,听筒这几种Channel中自由切换音频通道。


工具代码

下面将会给出启用不同audio channel的方法,接着在合适的场景下,调用对应的方法,就可以了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
	//重置状态
	private void reset(AudioManager audioManager) {
		if (audioManager != null) {
			audioManager.setMode(AudioManager.MODE_NORMAL);
			audioManager.stopBluetoothSco();
			audioManager.setBluetoothScoOn(false);
			audioManager.setSpeakerphoneOn(false);
			audioManager.setWiredHeadsetOn(false);
		}
	}
	//选择蓝牙作为audio channel
	private void enableBluetooth(){
		reset(audioManager);
		audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
		audioManager.startBluetoothSco();
		audioManager.setBluetoothScoOn(true);
	}
	//有限耳机
	private void enableWireHeadSet(){
		reset(audioManager);
		audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
		audioManager.setWiredHeadsetOn(true);
	}
	//手机扬声器
	private void enableSpeaker(){
		reset(audioManager);
		audioManager.setSpeakerphoneOn(true);
	}
	//手机听筒
	private void enableEarPiece(){
		reset(audioManager);
		audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
	}

场景

对于蓝牙场景的检测,需要注册蓝牙广播,来检测设备是否成功连接蓝牙。通过广播接收器对蓝牙状态进行判断从而选择合适的audio channel。

对于耳机可通过AudioManager的isWiredHeadsetOn方法或者注册广播监听headset plug status来判断,当前是否连接耳机。

参考

https://stackoverflow.com/questions/22770321/android-switching-audio-between-bluetooth-and-phone-speaker-is-inconsistent

https://developer.android.com/guide/topics/connectivity/bluetooth#Permissions

个人公众号