如何在Android中获取wifi热点的IP?

sir*_*ion 15 java android wifi android-wifi

正如标题所说......我试图在配置为热点时能够获得wifi的IP.理想情况下,我想找到适合所有手机的东西.

当然,在从AP获取信息时,WifiManager是无用的.

幸运的是,通过这样做,我已经能够获得所有接口的IP:

public String getLocalIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    Log.d("IPs", inetAddress.getHostAddress() );
                }
            }
        }
    } catch (SocketException ex) {
        Log.e(LOG_TAG, ex.toString());
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

这段代码将打印所有接口的所有IP(包括Wifi热点).主要问题是我找不到识别WiFi接口的方法.这是一个问题,因为有些手机有多个接口(WiMax等).这是我到目前为止所尝试的:

  • 通过wifi iface显示名称进行过滤:这不是一个好方法,因为显示名称从一个设备更改为另一个设备(wlan0,eth0,wl0.1等).
  • 通过其mac地址过滤:几乎可以工作,但在某些设备上,热点iface没有MAC地址(iface.getHardwareAddress()返回null)...所以不是有效的解决方案.

有什么建议?

ajm*_*jma 9

这是我为了获得wifi热点ip而做的事情:

public String getWifiApIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en
                .hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            if (intf.getName().contains("wlan")) {
                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr
                        .hasMoreElements();) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress()
                            && (inetAddress.getAddress().length == 4)) {
                        Log.d(TAG, inetAddress.getHostAddress());
                        return inetAddress.getHostAddress();
                    }
                }
            }
        }
    } catch (SocketException ex) {
        Log.e(TAG, ex.toString());
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

这将为您提供任何 wifi设备的IP地址,这意味着它不仅仅适用于热点.如果你连接到另一个wifi网络(意味着你不在热点模式),它将返回一个IP.

你应该先检查你是否处于AP模式.您可以使用此类:http://www.whitebyte.info/android/android-wifi-hotspot-manager-class

  • 这不是100%正确.我发现网络接口名称变化很大.HTC Desire Z:wl0.1; Prestigio 3540:ap0; Nexus 5 /三星DUOS:wlan0.另一方面,在所有情况下,只列出了一个设备(没有环回等). (2认同)
  • 此代码在接口名为 ap0 的某些设备上不起作用。我建议以下更正: if ((intf.getName().contains("wlan")) ||(intf.getName().contains("ap"))) { 在我的手机上有一个接口 wlan0 但它没有 inet 地址,因为 IP 地址在 ap0 上。在我的情况下,我也有环回接口。当它连接到 wifi 路由器时,它使用 wlan0。 (2认同)

ten*_*ica 0

这是一个可能的解决方案,用于WiFiManager ConnectionInfo查找相应的NetworkInterface.

如果您只需要 IP,那么您可以使用:

WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,但这不是解决方案。正如我之前所说,当 iface 处于 AP 模式时,WifiManager 是没有用的。Android“认为”Wifi 已禁用。另一方面,我尝试了与您提供的解决方案类似的方法,但使用 MAC 地址而不是 IP。但正如我已经指出的,它不起作用。由于某种原因,wifi iface 的 mac 地址为空(在某些设备中)。 (3认同)
  • 是的,确实如此。相信我,这种方法行不通。如果你愿意的话可以尝试一下..:/ (2认同)