android13中,"插入耳机后, 内置喇叭被屏蔽"在 system_server中的 相关代码 及逻辑
时间: 2024-03-03 18:47:25 浏览: 21
在 Android 13 中,"插入耳机后,内置喇叭被屏蔽"的逻辑在 system_server 进程中实现。具体来说,涉及到了 AudioManagerService 和 AudioPolicyService 两个服务,以下是相关代码及逻辑:
1. AudioManagerService.java
```java
// 处理耳机插入和拔出事件
private void handleHeadsetEvent(boolean connected) {
synchronized (mConnectedDevices) {
// 更新当前连接的音频设备列表
updateAudioDeviceListLocked();
// 根据当前连接的音频设备列表,设置音频路由
updateRoutingStrategy(connected);
}
}
// 更新当前连接的音频设备列表
private void updateAudioDeviceListLocked() {
// 获取当前连接的音频设备列表
mConnectedDevices = mDeviceInventory.getDevices();
}
// 根据当前连接的音频设备列表,设置音频路由
private void updateRoutingStrategy(boolean connected) {
// 判断是否连接耳机
if (connected) {
// 连接耳机时,将音频路由设置为耳机
mAudioPolicy.setWiredDeviceConnectionState(AudioSystem.DEVICE_OUT_WIRED_HEADSET,
AudioSystem.DEVICE_STATE_AVAILABLE, "", "");
mAudioPolicy.setWiredDeviceConnectionState(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE,
AudioSystem.DEVICE_STATE_AVAILABLE, "", "");
} else {
// 拔出耳机时,将音频路由设置为扬声器
mAudioPolicy.setWiredDeviceConnectionState(AudioSystem.DEVICE_OUT_WIRED_HEADSET,
AudioSystem.DEVICE_STATE_UNAVAILABLE, "", "");
mAudioPolicy.setWiredDeviceConnectionState(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE,
AudioSystem.DEVICE_STATE_UNAVAILABLE, "", "");
}
}
```
上述代码中,AudioManagerService 服务中的 handleHeadsetEvent() 方法用于处理耳机插入和拔出事件。在事件处理过程中,首先通过 updateAudioDeviceListLocked() 方法更新当前连接的音频设备列表,然后根据当前连接的音频设备列表,使用 updateRoutingStrategy() 方法设置音频路由。如果插入了耳机,就将音频路由设置为耳机,否则将音频路由设置为扬声器。
2. AudioPolicyService.java
```java
// 设置音频路由策略
public synchronized void setWiredDeviceConnectionState(int type, int state, String address, String name) {
// 更新当前连接的音频设备列表
updateDeviceConnectionState(type, state, address, name);
// 根据当前连接的音频设备列表,更新音频路由策略
updateAudioRoutes();
}
// 更新音频路由策略
private void updateAudioRoutes() {
synchronized (mCurAudioRoutes) {
// 根据当前连接的音频设备列表,设置音频路由策略
if (mDeviceInventory.isSourceActive(AudioSystem.DEVICE_IN_WIRED_HEADSET)
|| mDeviceInventory.isSourceActive(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP)) {
// 当有耳机或蓝牙 A2DP 设备连接时,将音频路由设置为耳机或蓝牙 A2DP 设备
mCurAudioRoutes.bluetoothName = mDeviceInventory.getDeviceName(
AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP);
mCurAudioRoutes.bluetoothAddress = mDeviceInventory.getDeviceAddress(
AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP);
mCurAudioRoutes.deviceType = AudioRoutesInfo.DEVICE_OUT_BLUETOOTH_A2DP;
} else {
// 当没有耳机或蓝牙 A2DP 设备连接时,将音频路由设置为扬声器
mCurAudioRoutes.deviceType = AudioRoutesInfo.DEVICE_OUT_SPEAKER;
}
// 更新音频路由策略
sendAudioRoutesChangedInternal(mCurAudioRoutes);
}
}
```
上述代码中,AudioPolicyService 服务中的 setWiredDeviceConnectionState() 方法用于设置音频路由策略。在设置过程中,首先通过 updateDeviceConnectionState() 方法更新当前连接的音频设备列表,然后根据当前连接的音频设备列表,使用 updateAudioRoutes() 方法更新音频路由策略。如果有耳机或蓝牙 A2DP 设备连接,就将音频路由设置为耳机或蓝牙 A2DP 设备,否则将音频路由设置为扬声器。
总之,Android 13 中的"插入耳机后,内置喇叭被屏蔽"的逻辑主要是通过 AudioManagerService 和 AudioPolicyService 两个服务来实现的。具体实现方式可以参考上述代码。