2012-06-13 9 views
20

Sto cercando di ottenere l'indirizzo IP di un dispositivo utilizzando la connessione WIFI o 3G. Sto ottenendo l'indirizzo IP in formato IPV6 che non è comprensibile. Voglio in IPV4 indirizzo IP formato. Ho fatto google ma dint ha trovato soluzioni adeguate.Come ottengo IP_ADDRESS in formato IPV4

qui è il codice che sto usando per ottenere l'indirizzo IP di un dispositivo

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

sto ottenendo questo output:

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

deve essere visualizzata in questo modo:

192.168.1.1 

per favore aiutatemi ..

risposta

44

Dopo aver provato molti trucchi .. finalmente posso ottenere l'indirizzo IP nel formato IPv4 .. Ecco il mio codice ..

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

Aggiunto se condizioni, come illustrato di seguito

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

invece di questo

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

Molte grazie .. Rahul

Un'alternativa per verificare se l'indirizzo è un indirizzo versione 4 è:

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

Non dimenticare l'autorizzazione per evitare risultati nulli : Vyacheslav

+0

Dove e cosa dichiarare "ipv4" questo – CrazyMind

2

Sembra che ci sia una classe separata Inet4Address nell'API Java per gli indirizzi IPv4.

+0

Ho provato, ma il suo dare l'indirizzo IP predefinito di un indirizzo ip non localhost IP .. –

+0

Localhost è 127.0.0.1, dubito che è quello che vuoi. –

+0

@ Tech.Rahul se si desidera ottenere l'host locale non è possibile utilizzare qualcosa come 'InetAddress addr = InetAddress.getLocalHost();'? – 0nyx

8

Non si può presumere che qualsiasi dispositivo ha un solo indirizzo di rete. Inoltre, non si può presumere che abbia IPv4 - potrebbe essere solo IPv6, quindi l'applicazione dovrà essere in grado di gestire sia gli indirizzi IPv4 che IPv6.

In genere, un telefono Android ha almeno due interfacce a cui vengono assegnati indirizzi ip utilizzabili, rmnet0 per i dati 3G, che per IPv4 è spesso NATed carrier-grade e quindi non può accettare connessioni socket in ingresso e può anche avere un IPv6 indirizzo; e wlan0 per il wifi, che avrà qualunque indirizzo IPv4 e/o IPv6 in grado di negoziare con la rete a cui si collega.

Alcune versioni di Android eliminano intenzionalmente il collegamento (solitamente più costoso) rmnet0 quando si collega al wifi, nel tentativo di ridurre l'utilizzo dei dati 3G. Questo comportamento è un problema quando il wifi è collegato a qualcosa che è un portale captive che richiede un accesso manuale.