如何查找用户所在的国家

4

我正在为安卓平台构建一个Cordova应用。

我需要获取用户的国家信息。

我知道地理位置服务能够提供GPS坐标。

有没有一种方法可以在不使用外部API的情况下获取国家信息?如果不可能,最佳解决方案是什么?

4个回答

3
从用户体验和法律角度来看,需要注意以下三种不同的国家情况:
1. 当前所在地的国家:使用地理位置API和任何映射解决方案。这是确定位置国家的唯一可靠方法,因为通过IP或SIM卡检测只能识别电信提供商的国家。请注意,当前位置的国家并非公民国家,并且无法确定用户的语言或区域设置偏好。
2. 国家作为本地化的上下文:使用ECMAScript国际化API[1]和cordova-globalization-plugin[2]作为备用。请注意,这些API根本不提供位置信息:语言和区域设置信息与用户的国家不同(例如,用户可以选择法语区域设置和en_US语言,而居住在摩纳哥并拥有俄罗斯国籍)。
3. 公民国家:在某些情况下,这是您服务的关键信息(例如,当客户端-服务器系统收集的用户个人数据必须按照法律要求在公民国家进行物理处理时)。确定它的唯一方法是询问用户并要求他按照您的服务条款诚实回答。请注意,公民国家不确定本地化设置或用户的当前位置。
[1] http://www.ecma-international.org/ecma-402/1.0/ [2] https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-globalization/

2
我可以想到几个选项。下面提供了列表,按照所需的最小努力和另一方面信息的准确性排序。
  1. 使用 全球化插件 提供的用户区域设置字符串,它可能包含语言代码旁边的国家/地区代码,例如“en-US”或“en-GB”。

用法

function successCallback(obj) {
    var locale = obj.value;
}
navigator.globalization.getPreferredLanguage(successCallback, errorCallback);

仅适用于Android:使用插件,例如设备信息插件,它允许您访问Android的电话管理器信息。通过此信息,您可以获取您手机网络提供商的国家ISO代码,根据插件作者所述。要使用该插件,您的代码应如下所示。
deviceInfo.get(function(result) {
    console.log("result = " + result); 
}, function() {
    console.log("error");
});

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

  1. 根据国家边界作为GPS,自行计算GPS到国家的转换。一个可能的地图(数据集)可以在此处找到[World Borders Dataset]。不过,我建议您使用一些外部API来获取该信息。

谢谢你的回答: 1- 不能信任,我从摩洛哥进行了测试,发现它给出en-US,我认为这个信息与设置有关,而不是位置。 2- 这个解决方案可能有帮助,但我发现当用户禁用网络时,我需要获取有关国家的信息。 3- 可能是一个解决方案,我希望已经有人做过了,但找不到。 - Cabtine Yassine
好吧,如果你真的需要让它可靠,那么没有人会说这很容易。我不知道iwen提到的地理编码器是如何工作的,但如果它不使用在线连接(正如我所假设的那样),它将在本地解决选项3。唯一缺少的是Cordova插件,有人需要编写。至少我没有看到为此目的而编写的插件。 - Roope Hakulinen
1
全球化插件不应该用于确定用户的国家,除非唯一的情况是目标是本地化用户体验,而国家信息并不是真正需要的。无论是全球化插件还是ECMAScript I18n API都不提供国家信息。用户选择的语言可能与他的国家完全无关,因此解码它是完全浪费时间的。 - Ivan Gammel

1

-3
一个简单的解决方案是创建一个自定义插件并使用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();
}

谢谢您的回答,关于地理编码器的问题是,为了使用此服务,必须显示地图,而我不需要显示这张地图。 - Cabtine Yassine
你不需要显示地图,我已经在没有地图的情况下使用它了。 - Ivan
在此页面上:https://developers.google.com/maps/documentation/geocoding/地理编码 API 只能与 Google 地图一起使用;禁止在不显示地图的情况下使用地理编码结果。有关允许使用的完整详细信息,请参阅 Maps API 服务条款许可限制。 - Cabtine Yassine
也许我错了(请告诉我),但是你的链接不正确。地理编码Web API要求地图显示,但是如果你查看链接中的示例,会发现有一个Web调用来转换或使用另一个Java库。在这个链接developer.android.com/reference/android/location/Geocoder.html(关于Geocoder对象的文档)中,我没有看到关于地图的强制要求... 另外,如果你查看你的链接中的Java库,我看到GeoApiContext context = new GeoApiContext().setApiKey("AIza...");。上面的代码(我的)不需要任何apikey,所以也许我错了,但我认为你的链接是关于其他API的,你觉得呢? - Ivan
抱歉Iwen,我以为你指的是网页版的Google Maps API。所以我们说的不是同一件事。尽管我不习惯插件开发,但我认为你提出的解决方案可能也会有所帮助。谢谢! - Cabtine Yassine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接