Подтвердить что ты не робот

Android API-23: замена InetAddressUtils

Переключение на Android Marshmallow API, я использовал org.apache.http.conn.util.InetAddressUtils для InetAddressUtils.isIPv4Address(ipAddress) в коде для отображения всех IP-адресов с устройства.

Как часть изменений API-23, класс InetAddressUtils теперь отсутствует.

Как заменить код ниже?

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

Ответ 1

Как я интерпретирую комментарии, вы можете заменить эту функцию следующим сравнением:

inetAddress instanceof Inet4Address

чтобы ваш код завершился:

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

Ответ 2

Я не мог найти что-то лучше, чем преобразовать в Inet4Address или 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;
     } 
}

Обратите внимание, что getHostByName действительно выполняет поиск, что не всегда желательно.

Или вы можете получить источник InetAddessUtils, который, в отличие от getByName(), не выполняет поиск, но принимает только точечные адреса. Код действительно крошечный. Он использует классы regexp, поддерживаемые Android. Просто удалите неизменяемую аннотацию, которая не очень важна, и она скомпилируется!

Ответ 3

Чтобы использовать эту библиотеку в SDK 23, добавьте следующую строку в файл build.gradle проекта:

useLibrary 'org.apache.http.legacy'

Ответ 4

Использование try catch как логики является ужасной практикой и должно выполняться только в случае, если это абсолютно неизбежно.

Используйте что-то вроде этого:

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