如何以IPV4格式获取IP_ADDRESS

23

我试图获取设备的IP地址,即使用WIFI或3G连接。我获得的是IPV6格式的IP地址,但这种格式不易理解。我想要获得IPV4格式的IP地址,我已经尝试过谷歌搜索,但未找到合适的解决方案。

以下是我使用的代码来获取设备的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个回答

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

非常感谢.. Rahul

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

if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address)

不要忘记权限以防止空结果:<uses-permission android:name="android.permission.INTERNET" /> - Vyacheslav
在哪里以及如何声明“ipv4”? - CrazyMind
@RahulBaradia InetAddressUtils是什么? - Shivam Kumar
@ShivamKumar 这是用来检查参数是否为有效的IPv4地址的。如需更多信息,请查看此链接https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/conn/util/InetAddressUtils.html。 - Rahul Baradia
感谢 @RahulBaradia - Shivam Kumar
请添加ipv4变量的正确声明。 - Oleksandr.D

9

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

通常,安卓手机至少有两个接口被分配可用的ip地址,rmnet0用于3G数据,对于IPv4通常是运营商级NAT,因此无法接受传入的socket连接,并且可能还有IPv6地址;而wlan0用于wifi,将与其连接的网络协商得到任何IPv4和/或IPv6地址。

某些版本的安卓将有意地在连接wifi时断开(通常更昂贵的)rmnet0链接,以尝试减少3G数据使用量。当wifi连接到需要手动登录的捕获门户时,这种行为会造成问题。


2

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


本地主机是127.0.0.1,我怀疑那不是你想要的。 - Chris Stratton
@Tech.Rahul 如果你想获取本地主机,你不可以使用 InetAddress addr = InetAddress.getLocalHost(); 这样的语句吗? - 0nyx
你在使用模拟器吗?如果是的话,可能会遇到一些困难,因为模拟器模拟的是移动连接而不是WiFi,并且它的网络连接是通过托管PC进行转发的。 - Chris Stratton
你希望用它做什么?无论如何,模拟器都不会接受来自主机的外部接口的流量,并且您可以从文档中了解到模拟器对运行在主机上的设备所呈现的地址。基本上,只有在您有一个真实的设备在wifi上运行并且想要从子网中的其他设备联系该设备时,知道实际IP地址才会有实际用途,在这种情况下,您可以从wifi API中获取地址。 - Chris Stratton
嗯,实际设备上我们可以知道IP地址,但是获取到的是IPv6格式。现在我也能够以IPv4格式获取了。感谢您的帮助。 - Rahul Baradia
显示剩余2条评论

0
以下是一种简单的方法来检查它是IPv4还是IPv6:
InetAddress address = InetAddress.getByName(ip);
if (address instanceof Inet6Address) {
    // It's ipv6
} else if (address instanceof Inet4Address) {
    // It's ipv4
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接