下面我们从代码角度分析getZoneIdForUid流程,首先是CarAudioManager的getZoneIdForUid方法:
//packages/services/Car/car-lib/src/android/car/media/CarAudioManager.java
public final class CarAudioManager extends CarManagerBase {
private final ICarAudio mService;
public int getZoneIdForUid(int uid) {
try {
return mService.getZoneIdForUid(uid); //调用ICarAudio的getZoneIdForUid方法
} catch (RemoteException e) {
return handleRemoteExceptionFromCarService(e, 0);
}
}
}
调用ICarAudio的getZoneIdForUid方法,ICarAudio是一个接口,由CarAudioService实现,因此会调用CarAudioService的getZoneIdForUid方法:
//packages/services/Car/service/src/com/android/car/audioCarAudioService.java
public class CarAudioService extends ICarAudio.Stub implements CarServiceBase {
@Override
public int getZoneIdForUid(int uid) {
enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS);
requireDynamicRouting();
synchronized (mImplLock) {
if (mUidToZoneMap.containsKey(uid)) {
return mUidToZoneMap.get(uid);
}
int userId = UserHandle.getUserHandleForUid(uid).getIdentifier(); //获取userId
return getZoneIdForUserIdLocked(userId); //获取ZoneId
}
}
}
调用getZoneIdForUserIdLocked方法:
//packages/services/Car/car-lib/src/android/car/media/CarAudioManager.java
public final class CarAudioManager extends CarManagerBase {
private int getZoneIdForUserIdLocked(@UserIdInt int userId) {
int audioZoneId = mOccupantZoneService.getAudioZoneIdForOccupant(
mOccupantZoneService.getOccupantZoneIdForUserId(userId));
if (audioZoneId != CarAudioManager.INVALID_AUDIO_ZONE) {
return audioZoneId;
}
Slogf.w(TAG,
"getZoneIdForUid userId %d does not have a zone. Defaulting to %s: %d",
userId, "PRIMARY_AUDIO_ZONE", PRIMARY_AUDIO_ZONE);
return PRIMARY_AUDIO_ZONE;
}
}