有人知道如何在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???
}
我搜索了一下,但没有找到任何可以得到答案的有用信息。 有些想法需要注意:
有没有人采用上述方法之一,或实施更好的方法?
感谢您的帮助。
答案 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 "";
}