我通常从设备的语言获得的国家。 它的工作原理,但现在我不得不承认巴西。 和大多数的设备只有葡萄牙语(PT_PT),并没有葡萄牙语(巴西)选项。
我检查这个线程: 我在哪里? -获取国家
方法
String locale = context.getResources().getConfiguration().locale.getCountry();
String locale = context.getResources().getConfiguration().locale.getDisplayCountry();
仍然是语言而已,于事无补。
还有,也与SIM卡的建议,但我不知道这是否会可靠地工作(做所有的SIM卡有这种独特的识别?),这也有点不正是我需要的,因为用户不能改变它(这是情况下,如果它是一个设置),它会使用设备,而无需SIM卡(也许他们只是用WLAN)排除用户。
还有地理位置的建议,但是这可能不会工作,已停用它的设备。 还是我错了?
如果没有别的帮助我会做一个对话框或菜单设置我的应用程序,使用户可以有选择它。 不过,我想先确认是否有与该设备的任何可靠的可能性。
你可以拉的位置从手机网络 :
TelephonyManager.getNetworkCountryIso()
或从SIM卡 :
TelephonyManager.getSimCountryIso()
或者,如果你有用户的电话号码 ,你可以通过匹配到国家这一数据 。
理想情况下,你可以使用所有这三个(以某种顺序,也许SIM,电话号码,然后网络),如果没有工作,利用反向地理位置作为最后的手段。
试试这个:
TelephonyManager teleMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
if (teleMgr != null){
countryISOCode = teleMgr.getSimCountryIso();
}
现在, countryISOCode
将包含以下类似ISO 3166国家代码按本维基百科的一个入口 。
地理位置将是最有效和最不显眼。 你总是可以使用地理定位,如果用户有它禁用显示问你的对话为自己的国家。 越少,你的错误,用户对信息的更好。
TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
mTelephonyManager.getNetworkCountryIso();
作为回答由Eric,上面的代码是最好的办法。 还值得一提的是,
mTelephonyManager.getSimCountryIso()
不应该使用,因为这将表明SIM卡供应商所在国的设备(如沃达丰英国SIM将返回“国标”,A沃达丰德国SIM将返回“德”),而不是当前位置(国家或地区)。 当用户漫游到这种差异是显著。
它的工作对我。
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();
}
............................