获得用户所在国家的可靠方法?

时间:2012-08-08 20:17:35

标签: android locale setting

我通常从设备的语言中获取国家/地区。它有效,但现在我必须承认巴西。大多数设备只有葡萄牙语(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)。

还有地理位置建议,但这可能不适用于已停用它的设备。或者我错了吗?

如果没有别的帮助我会在我的应用程序中进行对话或菜单设置,以便用户可以在那里选择它。但我首先要确认该设备是否有可靠的可能性。

5 个答案:

答案 0 :(得分:33)

您可以提取位置from the phone network

TelephonyManager.getNetworkCountryIso()

from the SIM card

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();
    }

............................