我通常从设备的语言中获取国家/地区。它有效,但现在我必须承认巴西。大多数设备只有葡萄牙语(pt_PT),没有葡萄牙语(巴西)选项。
我检查了这个帖子:Where am I? - Get country
方法
String locale = context.getResources().getConfiguration().locale.getCountry();
String locale = context.getResources().getConfiguration().locale.getDisplayCountry();
仍然只使用语言,没有帮助。
还有sim卡的建议,但我不确定这是否可靠(所有的SIM卡都有这种独特的识别吗?),它也不是我需要的,因为用户可以'改变它(如果它是一个设置就是这种情况),并且它将排除使用没有SIM卡的设备的用户(可能他们只是使用WLAN)。
还有地理位置建议,但这可能不适用于已停用它的设备。或者我错了吗?
如果没有别的帮助我会在我的应用程序中进行对话或菜单设置,以便用户可以在那里选择它。但我首先要确认该设备是否有可靠的可能性。
答案 0 :(得分:33)
您可以提取位置from the phone network:
TelephonyManager.getNetworkCountryIso()
TelephonyManager.getSimCountryIso()
或者,如果您have the user's phone number,您可以通过this data将其与国家/地区匹配。
理想情况下,您可以使用所有这三个(按某种顺序,可能是SIM,Phone#,然后是网络),如果没有,请使用反向地理位置作为最后的手段。
答案 1 :(得分:7)
试试这个:
TelephonyManager teleMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
if (teleMgr != null){
countryISOCode = teleMgr.getSimCountryIso();
}
现在,countryISOCode
将包含以下其中一项类似于此维基百科entry的ISO 3166国家/地区代码。
答案 2 :(得分:1)
地理定位将是最有效和不引人注目的。您可以随时使用地理位置,如果用户将其禁用,则显示要求其国家/地区的对话框。用户获取信息的麻烦越少越好。
答案 3 :(得分:1)
TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
mTelephonyManager.getNetworkCountryIso();
正如Eric所说,上面的代码是最好的方法。 值得注意的是,
mTelephonyManager.getSimCountryIso()
不应该被使用,因为这将表明SIM提供商的母国(例如,Vodaphone UK SIM将返回" gb",Vodaphone德国SIM将返回" de")而不是设备的当前位置(国家/地区)。 当用户漫游时,这种差异很大。
答案 4 :(得分:0)
这对我有用。
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();
}
............................