Как получить код страны для устройств CDMA Android? - PullRequest
4 голосов
/ 28 ноября 2011

Кто-нибудь знает, как получить информацию о коде страны для устройств Android в сетях CDMA?

Для всех остальных вы можете просто использовать TelephonyManager для этого:

String countryCode = null;
TelephonyManager telMgr = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if (telMgr.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA) 
    countryCode = telMgr.getNetworkCountryIso();
}
else {
    // Now what???
}

Я немного искал, но не нашел никакой полезной информации, которая могла бы привести к ответу. Некоторые идеи, некоторые на ум:

  • GPS местоположение: вы можете получить страну из GeoCoder ; и
  • IP-адрес: есть несколько хороших API для его получения, например ipinfodb .

Кто-нибудь делал один из вышеперечисленных подходов или реализовал лучшие?

Спасибо за помощь.

Ответы [ 3 ]

2 голосов
/ 23 июля 2012

Я нашел способ решения этой проблемы ... если это телефон CDMA, то в телефоне всегда есть аппаратное обеспечение ICC, сравнимое с SIM-картами в GSM. Все, что вам нужно сделать, это использовать системные свойства, связанные с аппаратным обеспечением. Программно вы можете использовать отражение Java, чтобы получить эту информацию. Это не изменится, даже если система рутирована в отличие от устройства GSM.

        Class<?> c = Class.forName("android.os.SystemProperties");
        Method get = c.getMethod("get", String.class);

        // Gives MCC + MNC
        String homeOperator = ((String) get.invoke(c, "ro.cdma.home.operator.numeric")); 
        String country = homeOperator.substring(0, 3); // the last three digits is MNC 
1 голос
/ 02 сентября 2018

на основе ответа @ rana, вот полный код, включая безопасность и сопоставление с кодом страны ISO

Я сопоставляю только страны, которые фактически используют сети CDMA, на основе этой вики-страницы .

private static String getCdmaCountryIso() {
    try {
        @SuppressLint("PrivateApi")
        Class<?> c = Class.forName("android.os.SystemProperties");
        Method get = c.getMethod("get", String.class);
        String homeOperator = ((String) get.invoke(c, "ro.cdma.home.operator.numeric")); // MCC + MNC
        int mcc = Integer.parseInt(homeOperator.substring(0, 3)); // just MCC

        switch (mcc) {
            case 330: return "PR";
            case 310: return "US";
            case 311: return "US";
            case 312: return "US";
            case 316: return "US";
            case 283: return "AM";
            case 460: return "CN";
            case 455: return "MO";
            case 414: return "MM";
            case 619: return "SL";
            case 450: return "KR";
            case 634: return "SD";
            case 434: return "UZ";
            case 232: return "AT";
            case 204: return "NL";
            case 262: return "DE";
            case 247: return "LV";
            case 255: return "UA";
        }

    } catch (ClassNotFoundException ignored) {
    } catch (NoSuchMethodException ignored) {
    } catch (IllegalAccessException ignored) {
    } catch (InvocationTargetException ignored) {
    } catch (NullPointerException ignored) {
    }
    return "";
}
1 голос
/ 01 декабря 2011

Работает для CDMA, но не всегда - зависит от оператора сети.

Вот альтернативная идея , которая предлагает посмотреть исходящие SMS или звонки, чтобы выяснить номер телефона этого устройства, из которого затем можно определить CountryIso на основе международного телефонного кода ...

Надеюсь, это поможет

...