2012-06-11 54 views
0

我是新來的android開發,我正在做一個應用程序,通過短信將android設備的IP地址發送到另一個。我需要得到十進制的IP,就像這個192.168.0.4不是我從下面的代碼中得到的十六進制。任何想法如何做到這一點,並感謝您的幫助。以可讀形式獲取IP地址android代碼

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(); 
        if (!inetAddress.isLoopbackAddress()) { 
         return inetAddress.getHostAddress().toString(); 

        } 
       } 
      } 
     } catch (SocketException ex) { 
      Log.e(TAG, ex.toString()); 
     } 

     return null; 
    } 

回答

3

This post解釋瞭如何獲取設備的IP。

的代碼(從上述後服用),該位應該讓你的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(); 
       if (!inetAddress.isLoopbackAddress()) { 
        return inetAddress.getHostAddress().toString(); 
       } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e(LOG_TAG, ex.toString()); 
    } 
    return null; 
} 
+0

我收到IP怪異形式十六進制或東西,我需要像這樣192.168.0.0或類似的東西。請幫忙。 –

+0

我不知道該怎麼做,但是如果你按照我分享的鏈接,這個鏈接看起來相當簡短,它解釋瞭如何以正確的方式獲取設備的IP,以便在表單中獲得IP你在問。 –

+1

我知道,答覆有點遲,但這可能對其他人有幫助。您可以使用以下條件:if(!inetAddress.isLoopbackAddress()&& inetAddress instanceof Inet4Address)過濾掉您的結果。這應該只給你很好格式化的IPv4地址。 –

-1

該信息可從外殼,使用getprop命令。

8
public static String getLocalIpv4Address(){ 
    try { 
     String ipv4; 
     List<NetworkInterface> nilist = Collections.list(NetworkInterface.getNetworkInterfaces()); 
     if(nilist.size() > 0){ 
      for (NetworkInterface ni: nilist){ 
       List<InetAddress> ialist = Collections.list(ni.getInetAddresses()); 
       if(ialist.size()>0){ 
        for (InetAddress address: ialist){ 
         if (!address.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4=address.getHostAddress())){ 
          return ipv4; 
         } 
        } 
       } 

      } 
     } 

    } catch (SocketException ex) { 

    } 
    return ""; 
} 

這應該好嗎?只有可用時,此函數纔會返回ipv4(以xxx.xxx.xxx.xxx模式)。

請注意,你提到的那些十六進制值應該是一個ipv6地址。

+0

是的,這工作對我來說。 +1爲此並感謝:) –

0

雖然hungr的回答是正確的,但我發現如果我通過ip_addresses爲特定設備「wlan0」例如,第一個地址是ipv6,第二個是ipv4。我只是返回第一個值,這就是爲什麼我只得到一個十六進制字符串。

for (InetAddress inetAddress : Collections.list(inetAddresses)) { 
       String ip_address = inetAddress.getHostAddress(); 
       Log.d(APP_NAME, "IP: " + ip_address); 
       //return if_name + ": " + ip_address; 
} 

通知我註釋掉「返回」