SubscriptionInfo.getMnc() возвращает одно и то же значение для обеих SIM-карт с разными операторами.

Я пытался получить номер MCC и MNC (в основном мне нужен номер IMSI, но этого также будет достаточно) на устройстве Android 5.1 с двумя SIM-картами (оба активны). Поскольку 5.1 поддерживает работу с двумя сим-картами, я использовал диспетчер подписок следующим образом:

SubscriptionManager manager = SubscriptionManager.from(this);
List<SubscriptionInfo> sil = manager.getActiveSubscriptionInfoList();
    if (sil != null) {
        for (SubscriptionInfo subInfo : sil) {
            Log.v("TestMain", "SubInfo:" + subInfo);
        }
    } else {
        Log.v("TestMain", "SubInfo: list is null");
    }

и получил этот вывод:

07-24 18:28:32.162    3844-3844/? V/TestMain﹕ SubInfo:{id=1, mcc 405 mnc 803, iccId=89918030914128062059 simSlotIndex=0 displayName=Aircel Karnataka carrierName=Aircel — Aircel Karnataka nameSource=0}
07-24 18:28:32.162    3844-3844/? V/TestMain﹕ SubInfo:{id=2,  mcc 405 mnc 803, iccId=8991860044481968955 simSlotIndex=1 displayName=CARD 2 carrierName=Vodafone Karnataka nameSource=0}

MCC (будет таким же, как и в той же стране), обратите внимание, что MNC одинаковы, хотя операторы связи разные.

Пока я выключал телефон, я увидел в своем логарифме следующие строки:

07-24 18:31:02.295      616-616/? V/KeyguardUpdateMonitor﹕ SubInfo:{id=1,  mcc 405 mnc 803, iccId=89918030914128062059 simSlotIndex=0 displayName=CARD 1 carrierName=Emergency calls only — Aircel Karnataka nameSource=0}
07-24 18:31:02.295      616-616/? V/KeyguardUpdateMonitor﹕ SubInfo:{id=2,  mcc 404 mnc 86, iccId=8991860044481968955 simSlotIndex=1 displayName=CARD 2 carrierName=Emergency calls only — Vodafone Karnataka nameSource=0}

Как вы можете видеть, приложение keyguard получает право MNC для обоих симов.

Итак, я изучил код приложения keyguard и обнаружил, что код такой же, как и код из исходного кода Android, взятого из здесь:

protected void handleSimSubscriptionInfoChanged() {
        if (DEBUG_SIM_STATES) {
            Log.v(TAG, "onSubscriptionInfoChanged()");
            List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList();
            if (sil != null) {
                for (SubscriptionInfo subInfo : sil) {
                    Log.v(TAG, "SubInfo:" + subInfo);
                }
            } else {
                Log.v(TAG, "onSubscriptionInfoChanged: list is null");
            }
        }

Я исследовал еще кое-что и обнаружил, что даже приложения для защиты клавиатуры получают правильный MCC только тогда, когда телефон выключается, в других случаях даже для обеих SIM-карт используется один и тот же MNC. Но имя перевозчика всегда отличное.

Это ошибка в Android 5.1 или я что-то не так делаю?


person Build3r    schedule 24.07.2015    source источник
comment
Я предполагаю, что это была ошибка в Android, она была исправлена ​​​​после того, как я обновил телефон.   -  person Build3r    schedule 13.08.2015
comment
Точно такая же проблема на Motorola Moto E под управлением Android 5.1.   -  person Beshoy Fayez    schedule 29.04.2016
comment
У меня такая же проблема на 6 андроиде.   -  person jollyroger    schedule 20.10.2016


Ответы (2)


У меня возникла такая же проблема в Android 5.1 в Samsung J5, но она работает в Android 6.0 в Moto X Play. Поскольку SubscriptionManager появился в Android 5.1, я предполагаю, что это ошибка в Android 5.1, которая была исправлена ​​в Android M.

person Imdad    schedule 23.05.2016

Это была ошибка в андроиде 5.1, она была исправлена ​​после того, как я обновил телефон.

person Build3r    schedule 10.06.2019