Android设备如何通过WiFi的DHCP获取IPv6地址?
解决方法
你的代码当前会遍历所有网络接口,返回第一个找到的非环回IPv6地址,所以即使WiFi未开启,也可能从其他接口(比如本地链路接口、移动数据接口)拿到IPv6。要只获取WiFi接口的IPv6,需要在遍历网络接口时过滤出WiFi对应的接口,再从中提取IPv6地址。
修改后的代码
public String getWifiIpV6() { try { // 遍历所有网络接口 for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { NetworkInterface intf = en.nextElement(); // 过滤WiFi接口:多数Android设备WiFi接口命名以"wlan"开头 if (!intf.getName().startsWith("wlan")) { continue; } // 确保接口处于启用(已连接)状态 if (!intf.isUp()) { continue; } // 遍历该接口下的所有地址 for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { InetAddress inetAddress = enumIpAddr.nextElement(); // 排除环回地址,且仅保留IPv6地址 if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet6Address) { // 去除IPv6地址中的作用域后缀(如%wlan0) String ipAddress = inetAddress.getHostAddress().split("%")[0]; return ipAddress; } } } } catch (Exception ex) { Log.e("IP Address", ex.toString()); } return null; }
关键修改点
- 筛选WiFi接口:通过
intf.getName().startsWith("wlan")匹配WiFi接口,适配绝大多数Android设备的接口命名规则; - 校验接口状态:用
intf.isUp()确保WiFi接口已启用并处于连接状态; - 处理IPv6后缀:部分IPv6地址会附带
%wlan0这类作用域标识,通过split("%")[0]去除,得到纯净的IPv6地址。
额外注意事项
- 需在
AndroidManifest.xml中添加必要权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> - Android 6.0及以上版本,需要动态申请
ACCESS_NETWORK_STATE权限; - 若设备WiFi接口命名不遵循"wlan"开头规则,可结合
ConnectivityManager先确认活跃WiFi网络,再匹配对应接口:ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo wifiInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (wifiInfo != null && wifiInfo.isConnected()) { // 执行后续接口遍历逻辑 }
内容的提问来源于stack exchange,提问作者Shadow
相关产品推荐
相关产品推荐

