获取我的wifi ip地址Android

Lui*_*rzi 39 ip android android-networking android-wifi

如何在wifi下连接时获取手机的IP地址?

我在这里找到了一个方法,但它返回了类似24.182.239.255的东西,即使我在wifi下,我期待像192.168.1.10这样的东西.

我喜欢这样的东西:

if (you are under wifi)
    String ip4 = getWifiIP()
else
    String ip4 = getIPAddress with the method linked before
Run Code Online (Sandbox Code Playgroud)

非常感谢!

ped*_*hdz 70

所以需要考虑的是不推荐使用Formatter.formatIpAddress(int):

此方法在API级别12中已弃用.使用getHostAddress(),它同时支持IPv4和IPv6地址.此方法不支持IPv6地址.

因此使用formatIpAddress(int)可能不是一个好的长期解决方案,尽管它会起作用.

如果您希望获得WiFi接口的IP地址,这是一个潜在的解决方案:

protected String wifiIpAddress(Context context) {
    WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
    int ipAddress = wifiManager.getConnectionInfo().getIpAddress();

    // Convert little-endian to big-endianif needed
    if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) {
        ipAddress = Integer.reverseBytes(ipAddress);
    }

    byte[] ipByteArray = BigInteger.valueOf(ipAddress).toByteArray();

    String ipAddressString;
    try {
        ipAddressString = InetAddress.getByAddress(ipByteArray).getHostAddress();
    } catch (UnknownHostException ex) {
        Log.e("WIFIIP", "Unable to get host address.");
        ipAddressString = null;
    }

    return ipAddressString;
}
Run Code Online (Sandbox Code Playgroud)

如前面的回复中所述,您需要在AndroidManifest.xml中设置以下内容:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Run Code Online (Sandbox Code Playgroud)

请注意,这只是一个示例解决方案.您应该花时间检查空值等,以确保UX顺利进行.

具有讽刺意味的是,一方面谷歌正在弃用formatIpAddress(int),但仍然有getIpAddress()仍然返回一个整数值.作为int的IP地址也规定它是符合IPv6的.

接下来是字节序可能是也可能不是问题.我只测试了三个设备,它们都是小端的.似乎字节顺序可能因硬件而异,即使我们在VM中运行,这仍然是一个问题.所以为了安全起见,我在代码中添加了一个endian检查.

getByAddress(byte [])似乎希望整数值为big endian.从研究它看来,网络字节顺序是大端的.有意义,因为像192.168.12.22这样的地址是一个大端数字.


查看HammerNet GitHub项目.它实现了上面的代码以及一堆健全性检查,处理AVD默认值的能力,单元测试和其他东西.我必须为我的应用程序实现这个,并决定开源库.

  • 对于Nexus 5及更多设备,字节顺序转换实际上非常重要.谢谢 ! (3认同)

Sid*_*h N 45

如果您想在连接到Wi-Fi时获取设备的私人IP地址,可以试试这个.

WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
String ipAddress = Formatter.formatIpAddress(ip);
Run Code Online (Sandbox Code Playgroud)

请务必添加权限

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Run Code Online (Sandbox Code Playgroud)

到你的清单.

  • 不推荐使用formatIpAddress().请参阅下面的Digital Rounin解决方案,改为使用InetAddress.getHostAddress(). (13认同)

Dus*_*tin 8

这将为您提供WiFi IPv4,IPv6或两者.

public static Enumeration<InetAddress> getWifiInetAddresses(final Context context) {
    final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    final WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    final String macAddress = wifiInfo.getMacAddress();
    final String[] macParts = macAddress.split(":");
    final byte[] macBytes = new byte[macParts.length];
    for (int i = 0; i< macParts.length; i++) {
        macBytes[i] = (byte)Integer.parseInt(macParts[i], 16);
    }
    try {
        final Enumeration<NetworkInterface> e =  NetworkInterface.getNetworkInterfaces();
        while (e.hasMoreElements()) {
            final NetworkInterface networkInterface = e.nextElement();
            if (Arrays.equals(networkInterface.getHardwareAddress(), macBytes)) {
                return networkInterface.getInetAddresses();
            }
        }
    } catch (SocketException e) {
        Log.wtf("WIFIIP", "Unable to NetworkInterface.getNetworkInterfaces()");
    }
    return null;
}

@SuppressWarnings("unchecked")
public static<T extends InetAddress> T getWifiInetAddress(final Context context, final Class<T> inetClass) {
    final Enumeration<InetAddress> e = getWifiInetAddresses(context);
    while (e.hasMoreElements()) {
        final InetAddress inetAddress = e.nextElement();
        if (inetAddress.getClass() == inetClass) {
            return (T)inetAddress;
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

用法:

final Inet4Address inet4Address = getWifiInetAddress(context, Inet4Address.class);
final Inet6Address inet6Address = getWifiInetAddress(context, Inet6Address.class);
Run Code Online (Sandbox Code Playgroud)

别忘了:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Run Code Online (Sandbox Code Playgroud)


Ell*_*otM 6

找到了这个不错的答案,https://gist.github.com/stickupkid/1250733

WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ipString = String.format(“%d.%d.%d.%d”, (ip & 0xff), (ip >> 8 & 0xff), (ip >> 16 & 0xff), (ip >> 24 & 0xff));
Run Code Online (Sandbox Code Playgroud)