Android想要获取公网IP地址,连接wifi的情况下在应用层开发的角度使用系统的API是做不到的,只能直接或间接利用第三方的接口服务:
1、公共接口:
搜狐:
/cityjson
返回格式:
var returnCitySN = {"cip": "XXXX", "cid": "XXX", "cname": "XX省XX市"};
淘宝(不稳定,经常访问不了):
/service/getIpInfo2.php?ip=myip
注意:淘宝的接口在请求时需要添加 “User-Agent” : “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36 Edg/80.0.361.109”,因为淘宝的这个接口只能用于PC浏览器访问,所以需要添加该标识让服务器认为这个请求是PC浏览器发起的。
返回格式:
{"code":0,"data":{"ip":"XXXXXX","country":"中国","area":"","region":"XX","city":"XX","county":"XX","isp":"XX","country_id":"CN","area_id":"","region_id":"XXX","city_id":"XXX","county_id":"xx","isp_id":"XXX"}}
在APP中调用接口,然后手动解析出IP地址,另外这两个接口都是http请求,在高版本系统上会出现请求失败,是因为从Android 9.0开始默认禁止了http请求,可以通过清单文件添加配置解决:
文件名随便起,文件内配置如下:
<?xml version="1.0" encoding="utf-8"?><network-security-config><base-config cleartextTrafficPermitted="true" /></network-security-config>
优点:无需接入门槛即可使用。
缺点:不稳定,接口不可用或者有改动,会发生异常。
2、各个地图服务API,比如:腾讯位置服务、百度地图、高德地图等等,需要到各平台注册成为开发者后才能使用API,并且还可能存在调用次数的限制。
所以建议采用多种策略进行获取。