安卓获取外网ip源码
安卓拿外网 IP,安卓最直接的外网办法是调一个公网接口。比如 https://api.ipify.org?源码format=json,返回 { "ip":"1.2.3.4"}。安卓别用 InetAddress.getLocalHost(),外网那玩意儿在安卓上经常返回 127.0.0.1 或者内网地址,源码跟外网 IP 半毛钱关系没有。安卓我见过不少新手栽在这上面,外网调试半天以为代码写错了,源码其实是安卓方法选错了。
写代码之前,外网先确认两件事。源码第一,安卓AndroidManifest.xml 里得加 INTERNET 权限,外网没这个连请求都发不出去,源码直接抛 SecurityException。第二,从 Android 9 开始默认禁止明文 HTTP,你如果用的接口是 http:// 开头,要么换成 HTTPS,要么在 manifest 里配 usesCleartextTraffic="true"。不过现在正经的 IP 查询接口基本都支持 HTTPS,没必要给自己找麻烦。
下面这段代码用 HttpURLConnection 实现,不依赖第三方库,适合不想引入 OkHttp 或 Retrofit 的场景。注意网络请求不能放在主线程,安卓会直接抛 NetworkOnMainThreadException。所以要么开子线程,要么用协程。
public static String getPublicIp() { String ip = null; try { URL url = new URL("https://api.ipify.org"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); if (conn.getResponseCode() == 200) { BufferedReader reader = new BufferedReader( new InputStreamReader(conn.getInputStream())); ip = reader.readLine(); reader.close(); } conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } return ip; } 这段代码返回的是纯文本 IP,比如 203.0.113.45。如果你想要 JSON 格式,把 URL 换成 https://api.ipify.org?format=json,然后解析一下就行。用 org.json.JSONObject 两行搞定:
JSONObject json = new JSONObject(response); String ip = json.getString("ip"); 实际项目里我更推荐用 OkHttp,代码更干净,连接池和超时管理也更省心。但如果你只是写个小工具或者做个 demo,上面那段原生代码足够了。另外提一句,ipify 这个接口有频率限制,免费版好像是一分钟 100 次左右。个人用完全没问题,但你要是做批量检测或者高频轮询,最好自己搭个代理或者换个接口。类似的还有 https://ifconfig.me/ip、https://icanhazip.com,返回格式略有不同,可以按需选。
有个坑得单独说:某些国产 ROM 在后台会限制网络访问,尤其是应用切到后台之后。你代码写得再对,系统给你掐了就是掐了。解决办法是把请求放在前台服务里,或者引导用户关掉电池优化。这个跟代码无关,但实际跑起来经常遇到,调试的时候别光盯着 logcat 看,也想想系统层面的限制。
最后给个协程版本,Kotlin 项目直接抄:
suspend fun fetchPublicIp(): String? = withContext(Dispatchers.IO) { try { val url = URL("https://api.ipify.org") val conn = url.openConnection() as HttpURLConnection conn.connectTimeout = 5000 conn.readTimeout = 5000 if (conn.responseCode == 200) { conn.inputStream.bufferedReader().readLine() } else null } catch (e: Exception) { null } } 调用的时候在 lifecycleScope 或者 viewModelScope 里启动就行。别忘了在 onDestroy 里取消,不然泄漏了又得查半天。获取外网 IP 这事本身不复杂,复杂的是安卓各种版本和厂商的限制。代码写对只是第一步,跑通才是真本事。
(责任编辑:知识)














