Использование нескольких 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());
}
это будет работать