如何在不使用GPS的情况下以编程方式检测Android设备当前所在的国家/地区?

当我的应用程序运行时,我想检测当前位置的国家/地区名称并为该特定国家/地区名称执行一些操作,我可以使用地理编码器,gps轻松完成。 但是我希望从Locale获得它,或者如果有更多可用的话。

我不知道Android API是否允许您检查相关GSM网络的提供商代码。 如果可能,您可以使用此代码进行检查,即针对此列表: http : //www.techgsm.com/page/gsm-provider-codes/network-provider-identify-codes.html以查明在哪个国家/地区手机是。

使用此链接http://ip-api.com/json ,这将以json的forms提供所有信息。 从这个json你可以很容易地到达这个国家。 此站点使用您当前的IP工作,它会自动检测IP和发送回复的详细信息。

文档http://ip-api.com/docs/api:json希望它有所帮助。

这就是我得到的。

{ "as": "AS55410 C48 Okhla Industrial Estate, New Delhi-110020", "city": "Kochi", "country": "India", "countryCode": "IN", "isp": "Vodafone India", "lat": 9.9667, "lon": 76.2333, "org": "Vodafone India", "query": "123.63.81.162", "region": "KL", "regionName": "Kerala", "status": "success", "timezone": "Asia/Kolkata", "zip": "" 

}

您可以(并且应该)使用Android的国家/地区检测器服务。 该服务由三个方法组成,所有方法都在.aidl中定义,这使您可以获取国家/地区代码,注册侦听器或删除它。 具体来说,你想要第一个 – Country detectCountry(); 它返回一个android.location.Country对象(AOSP中的frameworks / base / location / java / android / location / Country.java)。 我假设你知道如何以编程方式调用方法(你需要getSystemService(“country_detector”))。

要从命令行进行测试,请尝试:

 shell@flounder:/ $ service call country_detector 1 Result: Parcel( 0x00000000: 00000000 00000001 00000002 00530055 '............US' 0x00000010: 00000000 00000003 1d809dda 00000000 '................') 

对象序列化基本上只不过是2个字母的国家代码(这里是:US),源代码(这里,3,暗示这是从Locale中收集的),以及一个时间戳(1d809dda ……),它真的不是那个重要。 由于对象是Parcelable,因此您不必担心序列化。