Использование нескольких TelephonyManager с мульти сим-устройством

Я пытаюсь установить, когда на мультисимовском устройстве Android (под управлением Android 7.0+) есть работающие / включенные сим-карты. Для этого я следую документации Google, касающейся присоединения нескольких TelephonyManager к экземпляру TelephonyManager по умолчанию, согласно: https://developer.android.com/reference/android/telephony/TelephonyManager.html

Возвращенный TelephonyManager будет использовать подписку по умолчанию для всех вызовов. Чтобы вызвать API для определенной подписки, используйте createForSubscriptionId(int). например, telephonyManager = defaultSubTelephonyManager.createForSubscriptionId(subId);

В моем конкретном случае что-то вроде этого:

 telephonyManager = (TelephonyManager) mContext
                   .getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
telephonyManager.listen(phoneListener, PhoneStateListener.LISTEN_SERVICE_STATE);


List subList = mSubManager.getActiveSubscriptionInfoList();
        SubscriptionInfo firstSub = (SubscriptionInfo) subList.get(0);
    mSim0TelephonyManager = telephonyManager.createForSubscriptionId(firstSub.getSubscriptionId());
    mSim0TelephonyManager.listen(new Sim0PhoneStateListener(), PhoneStateListener.LISTEN_SERVICE_STATE);
    int test = mSim0TelephonyManager.getSimState();

SubscriptionInfo secondSub = (SubscriptionInfo) subList.get(1);
 mSim1TelephonyManager = telephonyManager.createForSubscriptionId(secondSub.getSubscriptionId());
mSim1TelephonyManager.listen(new Sim1PhoneStateListener(), PhoneStateListener.LISTEN_SERVICE_STATE);
 int testw = mSim1TelephonyManager.getSimState();

Итак, сначала я получаю все активные подписки, что уже было болезненно, потому что на самом деле это не активные подписки, как в подписках с состоянием обслуживания, а просто SIM-карты, вставленные в слоты для SIM-карт.

Это означает, что даже если вы отключите SIM-карту с помощью меню настроек Android, вы все равно получите эту SIM-карту в качестве активной подписки!!!!

Следующая проблема заключается в том, что даже на деактивированных (без обслуживания!!!) SIM-картах я получаю значение 5 ( https://developer.android.com/reference/android/telephony/TelephonyManager.html). Для меня это непостижимо, состояние SIM-карты готово, а вся SIM-карта деактивирована. Это означает, что эти вызовы API ненадежны...

Кроме того, после добавления PhoneStateListeners в отдельные новые TelephonyManager я не получаю никаких вызовов для реализации этих PhoneStateListeners, когда SIM-карты активируются / деактивируются через меню настроек Android...

Теперь мне интересно, не сломалось ли что-то в Android или, возможно, с реализациями производителей устройств (тестирование на Samsung A5 2017 Duo и Huawei P9 Lite). К сожалению, эмулятор не поддерживает multi-sim, поэтому я не могу протестировать на этом простую ванильную версию Android Nougat:(

ОБНОВИТЬ:

Тем временем я нашел эту тему: Как получить PhoneStateListener при использовании функции Dual SIM

Казалось бы, на самом деле в реализации Google есть ошибка внутри listen(PhoneStateListener listener, int events), которая приводит к тому, что PhoneStateListener создается только для SubscriptionId по умолчанию независимо от параметра, который передается в конструкторе....

0 ответов

Я не пробовал, но это может сработать для тебя

subids[] = SubscriptionManager.getSubscriptionId()
if (SubscriptionManager.isActiveSubscriptionId(subids[0])){
    mSim0TelephonyManager = telephonyManager.createForSubscriptionId(firstSub.getSubscriptionId());
}

это будет работать

Другие вопросы по тегам