获取用户所在国家/地区的可靠方法



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

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

相关内容

  • 没有找到相关文章

最新更新