2012-06-13 4 views
20

Próbuję uzyskać adres IP urządzenia, tj. Za pomocą połączenia WIFI lub 3G. Otrzymuję adres IP w formacie IPV6, który nie jest zrozumiały. Chcę w adresie IP w formacie IPV4. Zrobiłem google, ale dint znalazł odpowiednie rozwiązania.Jak uzyskać adres_IP w formacie IPV4?

tutaj jest kod, który używam, aby uzyskać adres IP urządzenia

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; 
} 

jestem coraz to Ouput:

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

Należy wyświetlany tak:

192.168.1.1 

proszę mi pomóc ..

Odpowiedz

44

Po wypróbowaniu wielu sztuczek .. wreszcie mogę uzyskać adres IP w formacie IPv4 .. Oto mój kod ..

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; 
} 

Dodany jeśli stan jak pokazano poniżej

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

zamiast tego

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

Wielkie dzięki .. Rahul

Alternatywą dla sprawdzenia, czy adres jest wersja 4 adres:

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

Nie zapomnij uprawnień, aby zapobiec wynikowi zerowemu : Vyacheslav

+0

Gdzie i co zadeklarować "ipv4" to – CrazyMind

2

Wygląda na to, że w języku Java API dla adresów IPv4 jest oddzielna klasa Inet4Address.

+0

Próbowałem, ale jego domyślny adres IP dawanie emulatorze nie localhost adres IP .. –

+0

localhost 127.0.0.1, wątpię, że to, co chcesz. –

+0

@ Tech.Rahul, jeśli chcesz uzyskać localhost nie możesz użyć czegoś takiego jak 'InetAddress addr = InetAddress.getLocalHost();'? – 0nyx

8

Nie można zakładać, że każde urządzenie ma tylko jeden adres sieciowy. Nie można również założyć, że będzie on miał dowolny IPv4 - może to być tylko IPv6, więc twoja aplikacja będzie musiała być w stanie obsłużyć zarówno wyświetlacze adresu IPv4, jak i IPv6.

Zwykle telefon z Androidem ma co najmniej dwa interfejsy, które otrzymują przypisane adresy IP, rmnet0 dla danych 3G, które dla IPv4 mają często translację NAT, a więc nie mogą akceptować połączeń przychodzących, a także mogą mieć IPv6 adres; i wlan0 dla wifi, które będzie miało dowolny adres IPv4 i/lub IPv6, który może negocjować z siecią, do której się przyłącza.

Niektóre wersje Androida będzie celowo upuścić (zazwyczaj droższy) odnośnik rmnet0 gdy przywiązuje do wifi - w celu zredukowania zużycia danych 3G. Takie zachowanie jest problemem, gdy sieć Wi-Fi jest podłączona do czegoś, co jest portalem przechwytującym, który wymaga ręcznego logowania.