You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android/Java如何获取用户移动网络或Wi-Fi下的IP地址?

Android 设备IP获取方案(支持移动数据/Wi-Fi、IPv4/IPv6)

一、本地内网IP获取(无需联网)

若需获取设备在当前网络中的内网IP(如Wi-Fi局域网地址、移动数据内网地址),可通过以下两种方式解决WifiManager的局限性:

1. 获取所有活跃网络接口的IP

遍历设备所有启用的网络接口,过滤无效接口后提取有效IPv4/IPv6地址:

fun getDeviceIpAddresses(): List<String> {
    val ipList = mutableListOf<String>()
    try {
        val networkInterfaces = NetworkInterface.getNetworkInterfaces()
        while (networkInterfaces.hasMoreElements()) {
            val ni = networkInterfaces.nextElement()
            // 跳过环回、虚拟、未启用的接口
            if (ni.isLoopback || ni.isVirtual || !ni.isUp) continue
            
            ni.inetAddresses?.let { addresses ->
                while (addresses.hasMoreElements()) {
                    val inetAddr = addresses.nextElement()
                    // 过滤环回、链路本地地址
                    if (!inetAddr.isLoopbackAddress && !inetAddr.isLinkLocalAddress) {
                        inetAddr.hostAddress?.takeIf { it.isNotEmpty() }?.let(ipList::add)
                    }
                }
            }
        }
    } catch (e: SocketException) {
        e.printStackTrace()
    }
    return ipList
}

2. 获取当前活跃网络的IP

精准获取当前正在使用的网络(Wi-Fi/移动数据)对应的IP,依赖ConnectivityManager实现:

fun getCurrentActiveIp(context: Context): List<String> {
    val ipList = mutableListOf<String>()
    val connManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    
    connManager.activeNetwork?.let { network ->
        connManager.getLinkProperties(network)?.linkAddresses?.forEach { linkAddr ->
            val inetAddr = linkAddr.address
            if (!inetAddr.isLoopbackAddress && !inetAddr.isLinkLocalAddress) {
                inetAddr.hostAddress?.takeIf { it.isNotEmpty() }?.let(ipList::add)
            }
        }
    }
    return ipList
}

注意事项

  • 以上方法获取的是内网IP,无法直接获取移动数据下的公网IP(运营商会做NAT转换)
  • 需在AndroidManifest.xml中声明权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • Android 10+适配无需额外定位权限,仅需网络状态权限

二、公网IP获取

若需获取设备的公网IP,只能通过第三方API接口实现,因为本地无法穿透运营商NAT直接获取公网地址。


内容的提问来源于stack exchange,提问作者TexD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:37:59