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

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

Возвращенный 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_STATE_READY).). Для меня это непонятно, состояние SIM готово, а вся SIM деактивирована. Это означает, что эти вызовы API вообще ненадежны...

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

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

ОБНОВЛЕНИЕ:

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

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


person TiGer    schedule 24.11.2017    source источник
comment
Если вы получаете одинаковые результаты от разных производителей (Samsung и Huawei), то, скорее всего, проблема в Android. Возможно, проблема будет связана с производителем чипсета, если эти устройства имеют общего производителя чипсета. К сожалению, нет устройства Google с несколькими SIM-картами (Nexus или Pixel), которое можно было бы использовать в качестве ориентира.   -  person CommonsWare    schedule 30.11.2017


Ответы (1)


я не пробовала, может тебе подойдет

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

это сработает

person chandu tangudu    schedule 23.09.2019