如何获得国家(或其ISO代码)?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获得国家(或其ISO代码)?相关的知识,希望对你有一定的参考价值。
获取国家/地区代码的最佳方式是什么?截至目前,我知道两种方法是通过TelephonyManager和另一种方法获取Locale,这是另一种在android中查找国家/地区代码的最佳和独特方式。
试试这个,
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String countryCode = tm.getSimCountryIso();
关于这一点总是有很多讨论,我永远不会理解为什么开发人员和公司会采用复杂的方式。用户选择的语言表示他/她希望始终在他/她的电话中看到的语言。他们不打算使用与其他语言或系统不同的语言。
选择非常直截了当:使用Locale(获取用户选择的语言作为首选),或者尽量让他们用他们已经说过他们不想看到的语言向他们展示信息。
要获取国家/地区代码,请执
Locale.getDefault().getCountry();
TelephonyManager tm = (TelephonyManager)getSystemService(getApplicationContext().TELEPHONY_SERVICE);
String countryCode = tm.getNetworkCountryIso();
它比getSimCountryIso
be更好,因为getSimCountryIso
依靠运营商在SIM卡上烧掉国家iso,它也支持CDMA网络。
您可以使用此代码获取ISO2:Locale.getDefault().getCountry()
而这要获得ISO3:Locale.getDefault().getISO3Country()
希望这可以帮助
我通过IP地址解决了它。您可以获取手机的IP地址。如果您正在使用wifi,那么它将是您的移动服务提供服务器的wifi热点或IP的IP地址,因此从该IP您可以发送到Web服务或跟踪该IP地址的国家/地区有一些来源(数据库)可用互联网这里提供IP国家的例子是http://whatismyipaddress.com/ip-lookup。
我认为ip是最好的方式,因为它会给你手机所在的国家,
如果你这样做的话
Locale.getDefault().getCountry();,
你有一个国家,用户选择国家,所以你可以选择英格兰,你可以在西班牙,也许你需要知道他在哪里的妈妈
示例:假设您的应用程序只能在英国购买,用户来自西班牙,但他正在英国度假,他想购买您的产品...如果您使用
Locale.getDefault().getCountry();
该用户将无法购买您的产品,所以ip是我认为最好的方式
Reto Meier有一篇很好的文章:http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html
它描述了获取Android设备位置的不同技术,包括源代码。接下来,当你有位置时,很容易获得国家 - 使用可以使用在线web-service或offline database
我知道这是一个非常古老的问题,但我认为这将有助于一些开发者:
没有GPS和Google服务(中国),很难找到这个国家。如果手机中没有SIM卡,TelephonyManager
将无法使用。
如果中国的用户将他的语言设置为英语(您将获得的国家将是美国或英国),Locale
将无效。
如果您的应用需要互联网连接,那么有一个选项。您可以使用名为ip-api的API。如果你打算使用它,请首先通过那里documentation
还有像freegeoip api这样的其他API
这是一个完整的例子。尝试从TelephonyManager(来自SIM或CDMA设备)获取国家/地区代码,如果不可用,请尝试从本地配置获取。
private static String getDeviceCountryCode(Context context) {
String countryCode;
// try to get country code from TelephonyManager service
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if(tm != null) {
// query first getSimCountryIso()
countryCode = tm.getSimCountryIso();
if (countryCode != null && countryCode.length() == 2)
return countryCode.toLowerCase();
if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
// special case for CDMA Devices
countryCode = getCDMACountryIso();
} else {
// for 3G devices (with SIM) query getNetworkCountryIso()
countryCode = tm.getNetworkCountryIso();
}
if (countryCode != null && countryCode.length() == 2)
return countryCode.toLowerCase();
}
// if network country not available (tablets maybe), get country code from Locale class
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
countryCode = context.getResources().getConfiguration().getLocales().get(0).getCountry();
} else {
countryCode = context.getResources().getConfiguration().locale.getCountry();
}
if (countryCode != null && countryCode.length() == 2)
return countryCode.toLowerCase();
// general fallback to "us"
return "us";
}
@SuppressLint("PrivateApi")
private static String getCDMACountryIso() {
try {
// try to get country code from SystemProperties private class
Class<?> systemProperties = Class.forName("android.os.SystemProperties");
Method get = systemProperties.getMethod("get", String.class);
// get homeOperator that contain MCC + MNC
String homeOperator = ((String) get.invoke(systemProperties,
"ro.cdma.home.operator.numeric"));
// first 3 chars (MCC) from homeOperator represents the country code
int mcc = Integer.parseInt(homeOperator.substring(0, 3));
// mapping just countries that actually use CDMA networks
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 null;
}
另一个想法是尝试像这个answer中的API请求,或使用fine location。
以上是关于如何获得国家(或其ISO代码)?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法使用(仅)国家代码(有效的 ISO-3166 代码)获得时区?
如何从 .NET 中的 CultureInfo 获取 ISO 3166 国家代码
有没有一种简单的方法来检索 ISO 3166-1 数字国家代码