如何获取CDMA Android设备的国家代码?

时间:2011-11-28 06:37:33

标签: android telephony telephonymanager cdma

有人知道如何在CDMA网络下检索Android设备的国家/地区代码信息吗?

对于所有其他人,您只需使用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 个答案:

答案 0 :(得分:2)

我找到了解决这个问题的方法..如果是CDMA手机,那么手机的ICC硬件总是与GSM中的SIM卡相当。您所要做的就是使用与硬件相关的系统属性。以编程方式,您可以使用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 :(得分:1)

适用于CDMA,但并非总是如此 - 取决于网络运营商。

这是一个alternative idea,它建议查看外发短信或来电以找出此设备的电话号码,然后您可以根据国际拨号代码找出CountryIso ...

希望这有帮助

答案 2 :(得分:1)

根据@rana的回复,这是完整代码,包括安全性和映射到ISO国家/地区代码

我仅根据this wiki page绘制了实际上使用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 "";
}