我通常从设备的语言中获取国家/地区。它有效,但现在我必须承认巴西。大多数设备只有葡萄牙语(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卡将返回"gb",沃达福德国SIM卡将返回"de"),而不是设备的当前位置(国家/地区)。当用户漫游时,这种差异非常显著。
它对我有用。
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();
}
............................