Android想要獲取公網IP地址,連接wifi的情況下在應用層開發的角度使用系統的API是做不到的,只能直接或間接利用第三方的接口服務:
1、公共接口:
搜狐:
http://pv.sohu.com/cityjson
返回格式:
var returnCitySN = {"cip": "XXXX", "cid": "XXX", "cname": "XX省XX市"};
淘寶(不穩定,經常訪問不了):
http://ip.taobao.com/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,並且還可能存在調用次數的限制。
所以建議採用多種策略進行獲取。