Android模拟器使用InetAddress获取IP地址异常如何解决
问题原因
你看到的异常拼接IP不是模拟器故障导致的,isSiteLocalAddress()判断规则会同时匹配IPv4和IPv6的站点本地地址,你的代码没有做地址类型区分,直接将返回的IPv6地址、IPv4地址拼接成了字符串,才会出现这个现象。
Android模拟器默认分配的10.0.2.15本身就是正确的虚拟网卡IPv4地址,不属于错误返回值。
方案1:修改代码过滤IPv4地址(推荐,全环境兼容无需调整配置)
新增地址类型判断,只收集IPv4的站点本地地址即可,修改后的代码如下:
public String getIpAddress() { String ip = ""; try { Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface .getNetworkInterfaces(); while (enumNetworkInterfaces.hasMoreElements()) { NetworkInterface networkInterface = enumNetworkInterfaces .nextElement(); Enumeration<InetAddress> enumInetAddress = networkInterface .getInetAddresses(); while (enumInetAddress.hasMoreElements()) { InetAddress inetAddress = enumInetAddress.nextElement(); // 新增判断:只取IPv4的站点本地地址 if (inetAddress.isSiteLocalAddress() && inetAddress instanceof Inet4Address) { ip += "SiteLocalAddress: " + inetAddress.getHostAddress() + "\n"; } } } } catch (SocketException e) { e.printStackTrace(); ip += "Something Wrong! " + e.toString() + "\n"; } return ip; }
修改后真机运行逻辑不变,模拟器也只会返回正确的IPv4地址。
方案2:调整模拟器配置禁用IPv6
如果不想修改代码,可以通过关闭模拟器IPv6支持解决问题:
- 启动模拟器后打开系统设置,进入「网络和互联网」页面,点击当前连接的WLAN网络
- 点击编辑按钮,将IP设置改为「静态」
- 关闭IPv6开关,保存配置后重启模拟器即可
内容的提问来源于stack exchange,提问作者SWIK
相关产品推荐
相关产品推荐

