3

如何在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

这些可以使用还是有更好的?

4

3 回答 3

2

我找到了解决这个问题的方法......如果是CDMA手机,那么手机总是具有与GSM中的SIM卡相当的ICC硬件。

您所要做的就是使用与硬件相关的系统属性。以编程方式,您可以使用 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
于 2012-07-23T19:02:25.703 回答
1

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

是另一种想法,它建议查看传出的短信或电话以找出此设备的电话号码,然后您可以从中根据国际拨号代码找出 CountryIso...

于 2011-12-01T14:56:18.587 回答
1

根据rana 的回复,这里是完整的代码,包括安全和映射到 ISO 国家代码。

根据此 Wikipedia 页面,我仅绘制实际使用 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 "";
}
于 2018-09-02T11:02:19.580 回答