意外的telephonyManager.getSimCountryIso()行为

Jor*_*uci 6 android localization

我正在创建一个应用程序,该应用程序将根据您的移动网络提供商所在的国家/地区显示该国家/地区的所有替代移动网络提供商的列表。为此,我正在使用telephonyManager.getSimCountryIso()检索国家/地区代码。

官方的android开发人员文档说:“返回与SIM卡提供商的国家/地区代码等效的ISO国家/地区代码”,因此从此我希望国家/地区代码始终始终与设备位置无关。但这不是它实际的工作方式! 例如,我最近遇到这种情况:我有一个带有西班牙SIM卡的android设备,属于西班牙网络提供商。因此,如果我在西班牙,TelephonyManager.getSimCountryIso()将返回“ es”。一切正常。问题例如,当我去法国旅行时,我调试了应用程序,发现telephonyManager.getSimCountryIso()返回的国家代码为:“ nl”(来自荷兰! 。与西班牙使用的设备和SIM卡相同,因此国家/地区代码ISO仍应为“ es”。

我的问题是这种方法实际上如何工作?如果我使用西班牙SIM卡,为什么会收到国家代码“ nl”(荷兰)?

预先感谢您的任何帮助

Mos*_*zar 4

您可以使用MCC MNC 获取 SIM 卡国家/地区,它是 SIM 卡配置的,与您所在的网络无关。

Configuration config = getResources().getConfiguration();
int countryCode = config.mcc;
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到MCC列表MccTable.java

例如西班牙是214,法国是208

MCC 应适用于所有带 SIM 卡的 GSM 设备,但在 CDMA 网络上不可靠

对于 CDMA 设备,我找到了以下解决方案

if (telephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
    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 
} else {
    Configuration config = getResources().getConfiguration();
    int countryCode = config.mcc;
}
Run Code Online (Sandbox Code Playgroud)