Android在托管热点时查找设备的IP地址

时间:2014-02-15 23:03:46

标签: android wifi ip-address android-wifi android-networking

我需要在托管热点时找到设备的IP地址。到目前为止我已经使用过这段代码了:

//if is using Hotspot
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)) {
                return inetAddress.getHostAddress();
            }
        }
    }
}

这很好用,但wifi NetworkInterface名称在某些设备上有所不同。所以我必须首先找到设备的wifi NetworkInterface名称(针对其热点)。我怎么能找到这个名字?或者是否有更好的方法来查找设备的IP地址?

///通过MAC查找正确的IP地址似乎也不起作用

7 个答案:

答案 0 :(得分:11)

首先,我尝试获取WiFi接口的MAC地址,将其与每个接口的MAC地址进行比较。但事实证明,至少在运行CM的N4上,打开热点时WiFi接口的MAC会发生变化。

所以我写了一些代码来遍历设备列表,找到识别wifi接口的东西。这段代码完全适用于我的N4:

private String getWifiIp() throws SocketException {
    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
            en.hasMoreElements(); ) {
        NetworkInterface intf = en.nextElement();
        if (intf.isLoopback()) {
            continue;
        }
        if (intf.isVirtual()) {
            continue;
        }
        if (!intf.isUp()) {
            continue;
        }
        if (intf.isPointToPoint()) {
            continue;
        }
        if (intf.getHardwareAddress() == null) {
            continue;
        }
        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses();
                enumIpAddr.hasMoreElements(); ) {
            InetAddress inetAddress = enumIpAddr.nextElement();
            if (inetAddress.getAddress().length == 4) {
                return inetAddress.getHostAddress();
            }
        }
    }
    return null;
}

只有一个界面符合所有条件:wlan0

可能的其他解决方案:

走一些最常见的界面名称并尝试在列表中找到它们:new String[] { "wlan0", "eth0", ...];

答案 1 :(得分:9)

我最近发现WifiAP IP地址在Android中是硬编码的。除非用户手动更改此值(我认为这是非常罕见的)使用硬编码值绝对足够。我认为这是最好的方式。 IP地址是&#34; 192.168.43.1&#34; :https://github.com/CyanogenMod/android_frameworks_base/blob/cm-10.1/wifi/java/android/net/wifi/WifiStateMachine.java?source=c#L1299

答案 2 :(得分:2)

这可以帮到你。

调用shell来询问网络适配器并检查你需要的那些就像是wlan所以请遵循以下代码

Process p=Runtime.getRuntime().exec("ip link show | grep -o \": wlan[0-9]:\" ");

BufferedReader readCommandOutput = 
    new BufferedReader(new InputStreamReader(p.getInputStream()));

String line=null;
while((line=readCommandOutput.readLine())!=null){
    // Lines containing wlan will be returned
    // parse to get the name of that interface.
    String interface=line.split(":")[1];
    //this is the interface you need.
}

if (line==null){
    //nothing was found.
}

readCommandOutput.close();

附加说明

This image is the output of the command on the shell. 或者您可以使用Play商店中的Android终端仿真器,以便在android shell中运行此命令。

用于检索IP地址

WifiManager wifi=(WifiManager)getSystemService(WIFI_SERVICE);
int address=wifi.getDhcpInfo().ipAddress;
Toast.makeText(this,intToIP(address),1).show();         


public String intToIP(int i) {
    return ((i & 0xFF) 
            + "." + ((i >> 8) & 0xFF)
            + "." + ((i >> 16) & 0xFF)
            + "." + ((i >> 24) & 0xFF));
 }

答案 3 :(得分:1)

当你想在同一设备上获取热点设备的ip而不知道如何在连接的设备上获取它时,此解决方案有效 (主要是服务器的IP是192.168.43.1,你可以通过硬编码来完成工作)

 public void serverip()

    {
     DhcpInfo dhcpInfo = wifiManager.getDhcpInfo();
            if (dhcpInfo==null){
                Toast.makeText(MainActivity.this, "No ip for server", Toast.LENGTH_SHORT).show();
            }else{

                Toast.makeText(MainActivity.this, "ip of server "+android.text.format.Formatter.formatIpAddress(dhcpInfo.gateway), Toast.LENGTH_SHORT).show();
    }


            }

答案 4 :(得分:0)

请将intf.getName()替换为intf.getDisplayName(),然后尝试。

答案 5 :(得分:0)

尝试此代码:

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()) {

                        String ip = Formatter.formatIpAddress(inetAddress.hashCode());
                        Toast.makeText(getApplicationContext(), "***** IP="+ ip, 1).show();

                        return ip;
                    }
                }
            }
        } catch (SocketException ex) {
            Toast.makeText(getApplicationContext(), "***** IP="+ex.toString(), 1).show();

        }
        return null;
    }

在oncreate上编写代码进行检查,热点已启用不是.....

WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); 
        wifiManager.setWifiEnabled(true);
        wifiManager.setWifiEnabled(false);
        boolean wifiEnabled = wifiManager.isWifiEnabled();
        if (wifiEnabled) {
            Toast.makeText(getApplicationContext(),"on",Toast.LENGTH_SHORT).show();
            getLocalIpAddress();
        }else {
                Toast.makeText(getApplicationContext(),"off",Toast.LENGTH_SHORT).show();
        }

答案 6 :(得分:0)

用户2224350说:“我最近发现WifiAP的IP地址在Android中是硬编码的。”

除非用户手动更改此值(我认为这非常罕见),否则使用硬编码值绝对足够。我认为这是最好的方式。 IP地址为“192.168.43.1”,as seen here

这适用于我的三星A3和华为PRA-LX1,但HTC Desires 530也可以返回192.168.1.1