23

我正在尝试获取设备的 IP 地址,即使用 WIFI 或 3G 连接。我得到了无法理解的 IPV6 格式的 IP 地址。我想要 IPV4 格式的 IP 地址。我已经完成了 google,但找到了任何合适的解决方案。

这是我用来获取设备IP地址的代码

public String getLocalIpAddress() {
    try {
        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();
                System.out.println("ip1--:" + inetAddress);
                System.out.println("ip2--:" + inetAddress.getHostAddress());
                if (!inetAddress.isLoopbackAddress()) {


                    String ip = inetAddress.getHostAddress().toString();
                    System.out.println("ip---::" + ip);
                    EditText tv = (EditText) findViewById(R.id.ipadd);
                    tv.setText(ip);
                    return inetAddress.getHostAddress().toString();

                }
            }
        }
    } catch (Exception ex) {
        Log.e("IP Address", ex.toString());
    }
    return null;
}

我得到这个输出:

ip1--:/fe80::5054:ff:fe12:3456%eth0%2
ip2--:fe80::5054:ff:fe12:3456%eth0

它应该像这样显示:

192.168.1.1

请帮帮我..

4

4 回答 4

48

在尝试了很多技巧之后..终于我可以得到IPV4格式的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();
                System.out.println("ip1--:" + inetAddress);
                System.out.println("ip2--:" + inetAddress.getHostAddress());

      // for getting IPV4 format
      if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4 = inetAddress.getHostAddress())) {

                    String ip = inetAddress.getHostAddress().toString();
                    System.out.println("ip---::" + ip);
                    EditText tv = (EditText) findViewById(R.id.ipadd);
                    tv.setText(ip);
                    // return inetAddress.getHostAddress().toString();
                    return ip;
                }
            }
        }
    } catch (Exception ex) {
        Log.e("IP Address", ex.toString());
    }
    return null;
}

添加if条件如下图

 /**This shows IPV4 format IP address*/
 if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4 = inetAddress.getHostAddress())){}

而不是这个

 /**This shows IPV6 format IP address*/
 if (!inetAddress.isLoopbackAddress()){}

非常感谢.. 拉胡尔

检查地址是否为版本 4 地址的另一种方法是:

if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address)
于 2012-06-14T04:33:05.460 回答
9

您不能假设任何设备都只有一个网络地址。您也不能假设它将具有任何 IPv4 - 它可能只是 IPv6,因此您的应用程序将需要能够处理 IPv4 和 IPv6 地址显示。

通常,Android 手机至少有两个接口可以分配可用的 IP 地址,rmnet0 用于 3G 数据,对于 IPv4,它通常是运营商级 NAT 的,因此不能接受传入的套接字连接,并且还可能具有 IPv6 地址;和 wlan0 用​​于 wifi,它将具有可以与其连接的网络协商的任何 IPv4 和/或 IPv6 地址。

某些版本的 Android 在连接到 wifi 时会故意丢弃(通常更昂贵的)rmnet0 链接 - 以试图减少 3G 数据使用量。当 wifi 连接到需要手动登录的强制门户时,此行为是一个问题。

于 2013-02-05T13:12:28.577 回答
2

在 Java API 中似乎有一个单独的类Inet4Address用于 IPv4 地址。

于 2012-06-13T13:35:32.227 回答
0

以下是检查它是 IPv4 还是 IPv6 的简单方法:

InetAddress address = InetAddress.getByName(ip);
if (address instanceof Inet6Address) {
    // It's ipv6
} else if (address instanceof Inet4Address) {
    // It's ipv4
}
于 2020-01-16T14:01:54.337 回答