我正在根据您的移动网络提供商来自哪个国家/地区创建应用,显示来自同一国家/地区的所有其他移动网络提供商的列表。为此,我使用telephonyManager.getSimCountryIso()检索国家/地区代码。
官方Android开发人员文档说:“返回SIM卡提供商的国家/地区代码等效的ISO国家/地区代码”,因此我希望国家/地区代码始终与设备位置无关。但那不是它的实际效果! 例如我最近遇到过这种情况: 我有一个来自西班牙的SIM卡的Android设备属于西班牙网络提供商。因此,如果我在西班牙,telephonyManager.getSimCountryIso()将返回“es”。到目前为止一切正常。 问题是我去法国旅行的时候我调试应用程序并找出telephonyManager.getSimCountryIso()返回国家代码:“nl”(来自荷兰!?我在法国漫游但使用相同的西班牙SIM卡!)。我使用与西班牙相同的设备和相同的SIM卡,所以国家代码ISO应该仍然是“es”。
我的问题是此方法实际如何运作?如果我使用西班牙语SIM卡,为什么我会收到国家代码“nl”(荷兰)?
提前感谢您提供任何帮助
答案 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;
}