Я занимаюсь разработкой приложения для пользовательской сборки 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, которые могут вызывать эту проблему?