获取用户所在国家/地区的可靠方法?
Posted
技术标签:
【中文标题】获取用户所在国家/地区的可靠方法?【英文标题】:Reliable method to get the country the user is in? 【发布时间】:2012-08-06 00:47:51 【问题描述】:我通常从设备的语言中获取国家/地区。它有效,但现在我必须承认巴西。而且大部分设备只有葡萄牙语(pt_PT),没有葡萄牙语(巴西)选项。
我检查了这个帖子:Where am I? - Get country
方法
String locale = context.getResources().getConfiguration().locale.getCountry();
String locale = context.getResources().getConfiguration().locale.getDisplayCountry();
仍然只有语言,没有帮助。
还有关于 sim 卡的建议,但我不确定这是否能可靠地工作(所有 sim 卡都有这个唯一标识吗?),它也有点不完全是我需要的,因为用户可以' t 改变它(如果它是一个设置就是这种情况),它将排除使用没有 sim 卡的设备的用户(也许他们只使用 WLAN)。
还有地理定位建议,但这可能不适用于已停用它的设备。还是我错了?
如果没有其他帮助,我会在我的应用程序中进行对话框或菜单设置,以便用户可以在那里选择它。但我想先确认一下该设备是否有任何可靠的可能性。
【问题讨论】:
反向地理编码是可能的,但可能有点矫枉过正。我发现 Bing 简单可靠。 对于反向地理编码,您的意思是像我链接的线程中的 EboMike 那样的方法,对吧? 不行,通过LocationManager使用手机的经纬度来获取该点所在的国家。 2021 根据最近的隐私法,这是不可能的 【参考方案1】:可以拉取位置from the phone network:
TelephonyManager.getNetworkCountryIso()
或from the SIM card:
TelephonyManager.getSimCountryIso()
或者,如果您have the user's phone number,您可以通过this data 将其与国家/地区相匹配。
理想情况下,您可以使用所有这三个(按某种顺序,可能是 SIM、电话号码,然后是网络),如果都不起作用,则使用反向地理定位作为最后的手段。
【讨论】:
但是getNetworkCountryIso似乎也主要依赖SIM卡,还是...? “仅当用户注册到网络时”或者这些可以是哪些网络? 这取决于您连接的运营商网络。每个人都有一个国家代码(正如文档所说,它返回“当前注册运营商的 MCC(移动国家代码)”)。 好的,谢谢您的建议。我会先尝试语言,如果没有足够的信息,电话/网络,然后是地理位置,如果仍然不够,显示一个自定义对话框。这将涵盖所有情况。 嗯。但是地理位置需要添加权限。如果所有用户都看到地理定位许可,这可能是负面的。特别是如果我只为某些巴西用户需要它..... 您可以在应用摘要中说明这一点,或者直接跳过地理定位并直接进入对话框。巴西用户可能不会考虑它。【参考方案2】:试试这个:
TelephonyManager teleMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
if (teleMgr != null)
countryISOCode = teleMgr.getSimCountryIso();
现在,countryISOCode
将包含以下内容之一,类似于此 Wikipedia entry 中的 ISO 3166 国家/地区代码。
【讨论】:
好的,感谢您提供更完整的代码,但这与 Eric 的建议基本相同,不是吗? 它更准确,因为它与原产国的 sim 卡绑定 - 但是...要小心,如果它的平板电脑没有 sim 卡,null
将被退回。在这种情况下,除非您专注于带 sim 卡的智能手机,否则就需要后备?
“来自原产国的 simcard”到底是什么意思?起源于什么...? TelephonyManager.getSimCountryIso()
返回 SIM 提供商的国家代码。
如果simcard是在西班牙买的,会有西班牙国家代码,同样如果simcard是在英国买的,也会有UK code。
嗯...好吧,这是否意味着TelephonyManager.getSimCountryIso()
将返回SIM 卡当前注册的代码?我需要有关用户位置的最新信息,购买 SIM 卡的位置并不重要,除非它是唯一可用的信息。现在为有用的输入 +1。【参考方案3】:
地理位置将是最有效和不引人注目的。您始终可以使用地理位置,如果用户禁用它,则显示您的对话框询问他们的国家。你对用户的信息越少越好。
【讨论】:
嗯,是的,也许我会做一些“降级”,首先尝试使用语言,然后尝试使用 sim 卡,然后使用地理定位,如果我仍然使用对话框作为最后的手段有模棱两可的信息。【参考方案4】:TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
mTelephonyManager.getNetworkCountryIso();
正如 Eric 所回答的,上面的代码是最好的方法。 还值得注意的是,
mTelephonyManager.getSimCountryIso()
不应使用,因为这将指示 SIM 提供商的所在国家/地区(例如,Vodaphone UK SIM 将返回“gb”,Vodaphone 德国 SIM 将返回“de”)而不是当前位置(国家/地区)设备。 当用户在漫游时,这种差异很显着。
【讨论】:
2021 不可能了!【参考方案5】:它对我有用。
String countryISOCode;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TelephonyManager teleMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
if (teleMgr != null)
countryISOCode = teleMgr.getSimCountryIso();
.......................
【讨论】:
以上是关于获取用户所在国家/地区的可靠方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何获取某个国家/地区的位置点取决于 Android 手机配置