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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:52:12