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
相关产品推荐
相关产品推荐

