当sharedUserId =“ android.uid.system”时,AudioDeviceCallback失败

时间:2018-11-13 15:51:50

标签: android android-source

我正在为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是否存在某些限制,可能导致此问题?

1 个答案:

答案 0 :(得分:0)

在AudioPolicy中,registerClient使用uid作为键。电话启动后,system_server或电信已经注册了通知,如果您的应用以系统用户身份运行,它将永远无法工作。

mNotificationClients.add(uid,notificationClient);