意外的telephonyManager.getSimCountryIso()行为

时间:2014-11-17 11:34:52

标签: android localization

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

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

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

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:3)

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

Configuration config = getResources().getConfiguration();
int countryCode = config.mcc;

您可以在此处找到MCC列表MccTable.java

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

  

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

对于CDMA设备,我找到了following solution

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;
}