我正在为Android自定义版本开发应用程序。
此应用需要在Android的AudioManager中订阅AudioDeviceCallback。
我正在使用:
mAudioManager.registerAudioDeviceCallback(new MyDeviceCallback(), null);
其中:
private class MyDeviceCallback extends AudioDeviceCallback {
@Override
public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
Log.d(LOG_TAG, "onAudioDevicesAdded(): New devices detected");
updateAuxStatus();
}
@Override
public void onAudioDevicesRemoved(AudioDeviceInfo[] devices) {
Log.d(LOG_TAG, "onAudioDevicesAdded(): devices removed");
updateAuxStatus();
}
private void updateAuxStatus() {
AudioDeviceInfo[] devices = mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);
boolean isPluggedIn = false;
for (AudioDeviceInfo device : devices) {
if (device.getType() == AudioDeviceInfo.TYPE_LINE_ANALOG) {
isPluggedIn = true;
}
}
onAuxPluggedInChanged(isPluggedIn);
}
}
当我以普通用户(u0_aXX)运行应用程序但以系统sharedUser(添加到清单)运行应用程序时,此方法运行良好:
android:sharedUserId="android.uid.system"
此回调仅在订阅后才被调用,但再也不会被调用。即使其他没有系统用户的应用也可以正常拨打电话。
我已经跟踪了对AudioManager代码的调用,发现以应用程序作为系统sharedUser运行时,从来没有为我的应用调用AudioPortEventHandler中的postEventFromNative。由于那是一次jni电话,我停止了,因为我不完全了解它的工作原理。
真正困扰我的是,在没有系统sharedUser的情况下运行时,相同的代码正在按预期工作。对系统sharedUser是否存在某些限制,可能导致此问题?
答案 0 :(得分:0)
在AudioPolicy中,registerClient使用uid作为键。电话启动后,system_server或电信已经注册了通知,如果您的应用以系统用户身份运行,它将永远无法工作。
mNotificationClients.add(uid,notificationClient);