Как получить PhoneStateListener при использовании функций Dual SIM

поэтому я в настоящее время реализую функцию переадресации вызовов в Android, для двух SIM-карт. Чтобы прочитать текущее состояние переадресации (включено / отключено) для SIM-карты, я делаю следующее:

  1. Я создаю объект TelephonyManager :

val telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager

  1. Я создаю объект PhoneStateListener и переопределяю метод onCallForwardingIndicatorChanged :

     val myPhoneStateListener = object: PhoneStateListener() { override fun onCallForwardingIndicatorChanged(isCallForwardingEnabled: Boolean) { if(isCallForwardingEnabled) println("Call forwarding enabled!") else println("Call forwarding disabled!") } } 
  2. Я зарегистрировал PhoneStateListener :

telephonyManager.listen(myPhoneStateListener, LISTEN_CALL_FORWARDING_INDICATOR)

Это отлично работает для первичной (первой) SIM-карты.

Но у меня возникают проблемы с тем же, что и для второй SIM-карты. Вот как я пытаюсь это сделать:

  1. Я использую объект SubscriptionManager для извлечения подписки на вторую SIM-карту:

     val subscriptionManager = getSystemService(TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager val subscriptionIdOfSimCard2 = subscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(1).subscriptionId 
  2. Я создаю отдельный TelephonyManager для второй SIM-карты с правильной подпиской:

     val secondTelephonyManager = (getSystemService(TELEPHONY_SERVICE) as TelephonyManager).createForSubscriptionId(subscriptionIdOfSimCard2) 
  3. Я создаю второй PhoneStateListener , как и тот, который для первой SIM-карты, позволяет называть его mySecondPhoneStateListener и регистрировать его со вторым TelephonyManager :

     secondTelephonyManager.listen(mySecondPhoneStateListener, LISTEN_CALL_FORWARDING_INDICATOR) 

Проблема в том, что в mySecondPhoneStateListener я не получаю обратные вызовы для второй SIM-карты, но все же первичный, первый. После копания в исходном коде Android я узнал, почему это так: в listen(PhoneStateListener listener, int events) в TelephonyManager используется неправильный listen(PhoneStateListener listener, int events) подписки, т. PhoneStateListener Не тот, который установлен в TelephonyManager а тот, который установлен в PhoneStateListener объект, который является подпиской Id первой SIM-карты, по умолчанию:

 public void listen(PhoneStateListener listener, int events) { if (mContext == null) return; try { Boolean notifyNow = (getITelephony() != null); sRegistry.listenForSubscriber(listener.mSubId, */ HERE: listener.mSubId is used instead of this.mSubId */ getOpPackageName(), listener.callback, events, notifyNow); } catch (RemoteException ex) { // system process dead } catch (NullPointerException ex) { // system process dead } } 

Эта проблема может быть решена путем установки правильного объекта subscriptionId для объекта PhoneStateListener , однако соответствующий конструктор скрыт:

 /** * Create a PhoneStateListener for the Phone using the specified subscription. * This class requires Looper.myLooper() not return null. To supply your * own non-null Looper use PhoneStateListener(int subId, Looper looper) below. * @hide */<-- HIDDEN, NOT ACCESSIBLE*/ */ public PhoneStateListener(int subId) { this(subId, Looper.myLooper()); } 

Я смог «решить» это с помощью рефлексии, установив поле PhoneStateListener объекта PhoneStateListener соответствующему подписчику II второй SIM-карты.

Но должен быть лучший способ сделать это, я что-то упустил?

Intereting Posts
Требуется ли знание Groovy для понимания Gradle? Две параллельные строки заменяются в строке kotlin Kotlin с JPA / Hibernate: без ленивой загрузки без `open`? Получена неразрешенная ссылка: setText при преобразовании java в kotlin Модуль должен быть установлен Сочетание результатов нескольких наблюдаемых Почему интеллектуальное сканирование сбрасывается для значения NULL после установки значения и проверки, является ли оно нулевым? Recruit-MP LightCalendarView – ошибка раздувания класса, noSuchMethodException Вызов функции в фрагменте представления пейджера из активности Вывод лямбда-типа Java не работает должным образом в Котлине Управление объектами в рамках мероприятий, чтобы избежать использования Null В реактивном программировании Android, как разбить потоковые данные объекта после применения фильтра? Как проверить лямбда-пустоту в котлине Objectbox: Как инициализировать ToMany <> отношение в kotlin Какова философия Котлина в тестах?