如何查找用户的国家/地区

时间:2015-01-05 14:34:41

标签: android cordova country

我正在为Android平台构建Cordova应用程序。

我需要获取用户的国家/地区。

我知道地理定位会给出GPS坐标。

有没有办法让国家不使用任何外部API?如果不可能,什么是最好的解决方案?

4 个答案:

答案 0 :(得分:3)

从UX和法律角度来看,您需要哪个国家/地区有重要区别:

  1. 当前位置的国家/地区:使用地理位置API和任何映射解决方案。这是确定位置国家的唯一可靠方式,因为通过IP或SIM卡检测可能仅识别电信提供商的国家/地区。请注意,当前位置的国家/地区不是公民身份的国家/地区,并且不允许确定用户的语言或区域设置偏好。
  2. 国家/地区作为本地化的背景:使用ECMAScript Internationalization API [1]和cordova-globalization-plugin [2]作为后备。请注意,这些API根本不提供位置信息:语言和区域设置信息与用户的国家/地区不同(例如,用户可以选择法语区域设置和en_US语言,同时居住在摩纳哥并且是俄罗斯公民)。
  3. 国籍国。在某些情况下,它是您服务的关键信息(例如,当客户 - 服务器系统收集的用户的个人数据必须在法律要求的公民身份国家/地区进行实际处理时)。确定它的唯一方法是要求用户要求您的服务条款提供他的诚实答复。请注意,该国籍/国家/地区不会确定本地化设置或用户当前位置。
  4. [1] http://www.ecma-international.org/ecma-402/1.0/

    [2] https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-globalization/

答案 1 :(得分:2)

我可以想到几个选择。下面提供了该列表,它是按需要的最小努力排序的,另一方面是信息的准确程度。

  1. 使用Globalization plugin提供的用户区域设置字符串,可能包含语言代码旁边的国家/地区代码,例如“en-US”或“en-GB”。
  2. 用法

    function successCallback(obj) {
        var locale = obj.value;
    }
    navigator.globalization.getPreferredLanguage(successCallback, errorCallback);
    
    1. 仅适用于Android :使用Device Information plugin等插件,可以访问Android's Telephony Manager's信息。从这些信息中,您可以获得
    2.   

      您的手机网络提供商的国家/地区ISO

      根据插件作者。要使用该插件,您的代码将看起来像这样

      deviceInfo.get(function(result) {
          console.log("result = " + result); 
      }, function() {
          console.log("error");
      });
      

      其中结果将包含 netCountry 调用字段作为返回字符串的一部分。

      1. 根据GPS的国家/地区边界,将GPS转换为国家/地区。一个可能的地图(数据集)可用[这里](世界边界数据集)。我建议只使用一些外部API为您提供该信息。

答案 2 :(得分:1)

如果您的应用仅适用于带有SIM卡的手机或设备,则可以使用SIM信息插件https://github.com/dtmtec/cordova-plugin-carrier

答案 3 :(得分:-2)

一个简单的解决方案是创建一个自定义插件并使用Google地理编码器,此代码从纬度和经度返回位置...这不是cordova,您需要进行一些更改

try {
   Geocoder gcd = new Geocoder(this, Locale.getDefault());
   List<Address> addresses = gcd.getFromLocation(latitude, longitude, 1);
         if (addresses.size() > 0)
         String cityname = addresses.get(0).getLocality();
         String country = addresses.get(0).getCountryName();
} catch (IOException e) {
     e.printStackTrace();
}