Как получить код страны для устройств Android CDMA?
Кто-нибудь знает, как получить информацию о коде страны для устройств Android в сетях CDMA?
Для всех остальных вы можете просто использовать 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.
Кто-нибудь сделал один из вышеуказанных подходов или реализовал лучшие?
Спасибо за помощь.
3 ответа
Это работает для CDMA, но не всегда - зависит от оператора сети.
Вот альтернативная идея, которая предлагает посмотреть исходящие SMS или звонки, чтобы выяснить номер телефона этого устройства, из которого затем можно определить CountryIso на основе международного телефонного кода...
Надеюсь это поможет
Я нашел способ решения этой проблемы... если это телефон CDMA, то в телефоне всегда есть оборудование ICC, сравнимое с SIM-картами в GSM. Все, что вам нужно сделать, это использовать системные свойства, связанные с аппаратным обеспечением. Программно вы можете использовать отражение 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
На основе ответа @rana, вот полный код, включая безопасность и сопоставление с кодом страны ISO
На этой вики-странице я отображаю страны, которые фактически используют сети 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 "";
}