如何获得IPV4格式的IP_ADDRESS

我正在尝试获取设备的IP地址,即使用WIFI或3G连接。 我得到IPV6格式的IP地址是不可理解的。 我想在IPV4格式的IP地址。我做了谷歌,但力德发现任何适当的解决scheme。

这里是我用来获取设备的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 

请帮我解决

Solutions Collecting From Web of "如何获得IPV4格式的IP_ADDRESS"

尝试了很多技巧后,终于可以得到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; } 

如果条件如下所示添加

  /**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) 

你不能假定任何设备只有一个networking地址。 你也不能认为它会有任何IPv4 – 它可能只是IPv6,所以你的应用程序需要能够处理IPv4和IPv6地址显示。

通常情况下,Android手机至less有两个接口分配可用的IP地址,rmnet0用于3G数据,对于IPv4数据通常是运营商级的NAT,因此不能接受传入的套接字连接,也可能有IPv6地址; 和wlan0的WiFi,它将拥有任何IPv4和/或IPv6地址,它可以与它所连接的networking进行协商。

某些版本的Android会在连接到wifi时故意删除(通常比较昂贵的)rmnet0链接 – 以减less3G数据的使用。 当wifi连接到需要手动login的强制门户网站时,这种行为是一个问题。

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