安卓原生定义了部分外部设备接入时是否静音,比如耳机、有线扬声器、HDMIOUT设备等,这些设备接入时,安卓会设置AudioSystem.STREAM_MUSIC为非静音状态
从代码里可以看出,当一个newDevice 接入时,会携带一个deviceID,然后根据设备ID判断这个 设备是否包含在解除静音的设备集合里
这里的几个设备分别对应
AudioSystem.DEVICE_OUT_WIRED_HEADSET | 有线耳机 |
---|---|
AudioSystem.DEVICE_OUT_WIRED_HEADPHONE | 有线扬声器 |
AudioSystem.DEVICE_OUT_LINE | 有线线路输出 |
AudioSystem.DEVICE_OUT_ALL_A2DP_SET | A2DP蓝牙设备 |
AudioSystem.DEVICE_OUT_ALL_USB_SET | USB音频设备 |
AudioSystem.DEVICE_OUT_HDMI | AudioSystem.DEVICE_OUT_HDMI |
大家按照自己所需移除调对应的设备即可,比如我不想让HDMIOUT接入的时候解除静音,就这样改
private static final Set<Integer> DEVICE_MEDIA_UNMUTED_ON_PLUG_SET;
static {
DEVICE_MEDIA_UNMUTED_ON_PLUG_SET = new HashSet<>();
DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.add(AudioSystem.DEVICE_OUT_WIRED_HEADSET);
DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.add(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE);
DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.add(AudioSystem.DEVICE_OUT_LINE);
DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.addAll(AudioSystem.DEVICE_OUT_ALL_A2DP_SET);
DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.addAll(AudioSystem.DEVICE_OUT_ALL_BLE_SET);
DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.addAll(AudioSystem.DEVICE_OUT_ALL_USB_SET);
//DEVICE_MEDIA_UNMUTED_ON_PLUG_SET.add(AudioSystem.DEVICE_OUT_HDMI);
}
或者我不想让ARC设备接入后保持静音状态,就判断一下设备类型设置一下:
private void onAccessoryPlugMediaUnmute(int newDevice) {
if (DEBUG_VOL) {
Log.i(TAG, String.format("onAccessoryPlugMediaUnmute newDevice=%d [%s]",
newDevice, AudioSystem.getOutputDeviceName(newDevice)));
}
if (AudioSystem.getOutputDeviceName(newDevice).contains("hdmi_arc")) {
Log.d(TAG, "lsl:onAccessoryPlugMediaUnmute: HDMI ARC device connected");
mStreamStates[AudioSystem.STREAM_MUSIC].mute(false, "onAccessoryPlugMediaUnmute");
}
2024-09-27更新:
上面的修改在接入了HDMIOUt设备时,静音后插拔HDMIOUT会导致主设备保持静音,但是从设备发出声音不同步现象,需要进一步优化,修改的地方如下
在静音的时候插拔设备,会设置设备音量,此时可在checkFixedVolumeDevices()这里拦截掉。