2012-06-13 35 views
20

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

这里是我使用得到一个设备的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 

请帮我解决..

回答

44

后试图花样繁多。最后,我可以得到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()){} 

非常感谢.. 拉胡尔

检查,如果地址是版本4的地址的替代方法是:

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

不要忘记权限,以防止空结果: Vyacheslav

+0

声明“ipv4”的地方和声明 – CrazyMind

2

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

+0

我试过,但它给出了一个模拟器的默认IP地址不是本地主机的IP地址.. –

+0

本地主机是127.0.0.1,我怀疑这是你想要的。 –

+0

@ Tech.Rahul如果你想得到本地主机,你可以不使用像'InetAddress addr = InetAddress.getLocalHost();'? – 0nyx

8

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

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

某些版本的Android会在连接到wifi时故意删除(通常较昂贵的)rmnet0链接 - 以尝试减少3G数据使用量。当wifi连接到需要手动登录的强制门户网站时,此行为就成了问题。