2015-08-21 4 views
17

Umstellung auf Android Marshmallow API, ich war org.apache.http.conn.util.InetAddressUtils für InetAddressUtils.isIPv4Address(ipAddress) in einem Code, um alle IPs von einem Gerät aufzulisten.Android API-23: InetAddressUtils Ersatz

Als Teil der API-23 changes ist die InetAddressUtils Klasse jetzt weg.

Wie kann ich den folgenden Code jetzt ersetzen?

public static String ipAddress() { 
    try { 
     for (final Enumeration<NetworkInterface> enumerationNetworkInterface = NetworkInterface.getNetworkInterfaces(); enumerationNetworkInterface.hasMoreElements();) { 
      final NetworkInterface networkInterface = enumerationNetworkInterface.nextElement(); 
      for (Enumeration<InetAddress> enumerationInetAddress = networkInterface.getInetAddresses(); enumerationInetAddress.hasMoreElements();) { 
       final InetAddress inetAddress = enumerationInetAddress.nextElement(); 
       final String ipAddress = inetAddress.getHostAddress(); 
       if (! inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipAddress)) { 
        return ipAddress; 
       } 
      } 
     } 
     return null; 
    } 
    catch (final Exception e) { 
     LogHelper.wtf(null, e); 
     return null; 
    } 
} 
+1

Was möchten Sie tun? Wenn Sie nur wissen wollen, ob eine IP IPv6 ist oder nicht, können Sie nach 'inetAddress instanz von Inet6Address' oder 'inetAddress instance von Inet4Address' suchen. – rekire

+0

Ich versuche, 'InetAddressUtils.isIPv4Address (ipAddress)' mit einem Code zu ersetzen, der mit Android API-23 funktioniert – shkschneider

+0

Wie seine Namen sagt: zurück, wenn die IP-Adresse IPv4 oder nicht https://hc.apache.org/ httpcomponents-client-ga/httpclient/apidocs/org/apache/http/conn/util/InetAddressUtils.html # isIPv4Address (java.lang.String) Diese Methode ist jetzt in Android API-23 nicht verfügbar. Ich möchte es nur ersetzen, aber ich kenne noch keine Alternativen. – shkschneider

Antwort

23

Wie ich aus den Kommentaren interpretieren Sie diese Funktion mit diesem Vergleich ersetzen:

inetAddress instanceof Inet4Address 

so würde der Code in beenden:

if(!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { 
+1

Nun, in der Tat "InetAddressUtils" ist von Android API-23, aber nicht "Inet4Address" gegangen. Vielen Dank für die Problemumgehung. – shkschneider

+0

Sie sind willkommen :-) – rekire

+0

Oder Sie können auch tun: Inet4Address.class.isInstance (InetAddress) – Bostone

2

ich es nicht besser etwas finden konnte als Umwandlung in Inet4Address oder Inet6Address

public boolean isValidIp4Address(final String hostName) { 
     try { 
     return Inet4Address.getByName(hostName) != null; 
    } catch (UnknownHostException ex) { 
     return false; 
    } 
} 

public boolean isValidIp6Address(final String hostName) { 
     try { 
     return Inet6Address.getByName(hostName) != null; 
    } catch (UnknownHostException ex) { 
     return false; 
    } 
} 

Beachten Sie, dass getHostByName tatsächlich die Suche ausführt, was nicht immer wünschenswert ist.

Oder Sie können Quelle von InetAddessUtils erhalten, die im Gegensatz zu getByName(), die Suche nicht durchführt, sondern nur gepunktete Adressen akzeptiert. Der Code ist wirklich winzig. Es verwendet Regexp-Klassen, die von Android unterstützt werden. Entfernen Sie einfach Immutable Annotation, die nicht wirklich wichtig ist, und es wird kompilieren!

+0

' getByName() 'scheint mir wie von "InetAddress" geerbt. – shkschneider

0

Mit try catch als Logik schreckliche Praxis und soll nur wenn absolut unvermeidbar geschehen ..

Verwendung so etwas wie diese stattdessen:

if (inetAddress instanceof Inet4Address){ 
    //do something 
} 
1

Um diese Bibliothek in SDK 23 Add verwenden folgende Zeile in Projekt build.gradle Datei:

useLibrary 'org.apache.http.legacy'