studio developer android android-networking android-6.0-marshmallow

developer - Android API-23: Reemplazo de InetAddressUtils



android studio 6.0 download (5)

Como interpreto de los comentarios, puedes reemplazar esa función con esta comparación:

inetAddress instanceof Inet4Address

por lo que su código terminaría en:

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

Al cambiar a la API de Android Marshmallow, estaba usando org.apache.http.conn.util.InetAddressUtils para InetAddressUtils.isIPv4Address(ipAddress) en un código para enumerar todas las IP de un dispositivo.

Como parte de los cambios de API-23 , la clase InetAddressUtils ahora se ha ido.

¿Cómo puedo reemplazar el código de abajo ahora?

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


No pude encontrar algo mejor que convertir a Inet4Address o 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; } }

Tenga en cuenta que getHostByName realiza la búsqueda, lo que no siempre es deseable.

O bien, puede obtener la fuente de InetAddessUtils , que a diferencia de getByName (), no realiza la búsqueda, pero solo acepta direcciones de puntos. El código es muy pequeño. Utiliza clases de expresiones regulares que son compatibles con Android. Simplemente elimine la anotación inmutable que no es realmente importante, ¡y se compilará!


Para usar esta biblioteca en el SDK 23, agregue la siguiente línea en el archivo build.gradle del proyecto:

useLibrary ''org.apache.http.legacy''


Usar try catch as logic es una práctica horrible y solo debe hacerse si es totalmente inevitable.

Use algo como esto en su lugar:

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


Agregue a continuación a su archivo build.gradle (Module: app),

android {useLibrary ''org.apache.http.legacy''}