Сбой AudioDeviceCallback, когда sharedUserId = "android.uid.system" - PullRequest
0 голосов
/ 13 ноября 2018

Я занимаюсь разработкой приложения для пользовательской сборки Android.

Это приложение должно подписаться на AudioDeviceCallback в AudioManager Android.

Я использую:

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 и обнаружил, что postEventFromNative в AudioPortEventHandler никогда не вызывается для моего приложения, когда оно работает как системный sharedUser. Поскольку это jni-звонок, я остановился, потому что не до конца понимаю, как это работает.

Что меня действительно беспокоит, так это то, что при работе без системы sharedUser тот же код работает, как и предполагалось. Есть ли какие-то ограничения в системе sharedUser, которые могут вызывать эту проблему?

1 Ответ

0 голосов
/ 04 апреля 2019

В AudioPolicy, registerClient использует uid в качестве ключа.Когда телефон загрузился, system_server или telecom уже зарегистрировали уведомление, если ваше приложение запускается как системный пользователь, оно никогда не будет работать.

mNotificationClients.add (uid ,tificationClient);

...