поэтому я в настоящее время реализую функцию переадресации вызовов в Android, для двух SIM-карт. Чтобы прочитать текущее состояние переадресации (включено / отключено) для SIM-карты, я делаю следующее:
TelephonyManager
: val telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
Я создаю объект PhoneStateListener
и переопределяю метод onCallForwardingIndicatorChanged
:
val myPhoneStateListener = object: PhoneStateListener() { override fun onCallForwardingIndicatorChanged(isCallForwardingEnabled: Boolean) { if(isCallForwardingEnabled) println("Call forwarding enabled!") else println("Call forwarding disabled!") } }
Я зарегистрировал PhoneStateListener
:
telephonyManager.listen(myPhoneStateListener, LISTEN_CALL_FORWARDING_INDICATOR)
Это отлично работает для первичной (первой) SIM-карты.
Но у меня возникают проблемы с тем же, что и для второй SIM-карты. Вот как я пытаюсь это сделать:
Я использую объект SubscriptionManager
для извлечения подписки на вторую SIM-карту:
val subscriptionManager = getSystemService(TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager val subscriptionIdOfSimCard2 = subscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(1).subscriptionId
Я создаю отдельный TelephonyManager
для второй SIM-карты с правильной подпиской:
val secondTelephonyManager = (getSystemService(TELEPHONY_SERVICE) as TelephonyManager).createForSubscriptionId(subscriptionIdOfSimCard2)
Я создаю второй 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-карты.
Но должен быть лучший способ сделать это, я что-то упустил?