19

我通常从设备的语言中获取国家/地区。它有效,但现在我必须承认巴西。而且大多数设备只有葡萄牙语(pt_PT),没有葡萄牙语(巴西)选项。

我检查了这个线程:我在哪里?- 获取国家

方法

 String locale = context.getResources().getConfiguration().locale.getCountry();

 String locale = context.getResources().getConfiguration().locale.getDisplayCountry();

仍然只有语言,没有帮助。

还有关于 sim 卡的建议,但我不确定这是否会可靠地工作(所有 sim 卡都有这个唯一标识吗?),它也有点不完全是我需要的,因为用户无法更改它(如果它是一个设置就是这种情况),它将排除使用没有 sim 卡的设备的用户(也许他们只使用 WLAN)。

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

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

4

5 回答 5

33

您可以从电话网络中提取位置:

TelephonyManager.getNetworkCountryIso()

从 SIM 卡

TelephonyManager.getSimCountryIso()

或者,如果你有用户的电话号码,你也许可以通过这个数据将它与国家相匹配。

理想情况下,您可以使用所有这三个(按某种顺序,可能是 SIM、电话号码,然后是网络),如果都不起作用,则使用反向地理定位作为最后的手段。

于 2012-08-08T20:23:28.527 回答
7

尝试这个:

 TelephonyManager teleMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
 if (teleMgr != null){
     countryISOCode = teleMgr.getSimCountryIso();
 }

现在,根据此 Wikipedia条目countryISOCode,将包含以下类似于 ISO 3166 国家/地区代码之一。

于 2012-08-08T20:38:58.377 回答
1

地理位置将是最有效和不引人注目的。您始终可以使用地理位置,如果用户禁用它,则显示您的对话框询问他们的国家。你对用户的信息越少越好。

于 2012-08-08T20:23:52.247 回答
1
TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
mTelephonyManager.getNetworkCountryIso();

正如 Eric 所回答的,上面的代码是最好的方法。另外值得注意的是,

mTelephonyManager.getSimCountryIso()

不应使用,因为这将指示 SIM 提供商的本国(例如,Vodaphone UK SIM 将返回“gb”,Vodaphone 德国 SIM 将返回“de”)而不是设备的当前位置(国家/地区)。当用户正在漫游时,这种差异是显着的。

于 2015-05-18T20:09:50.660 回答
-1

它对我有用。

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

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

于 2017-12-12T22:32:30.057 回答