Ответ 1
Как я интерпретирую комментарии, вы можете заменить эту функцию следующим сравнением:
inetAddress instanceof Inet4Address
чтобы ваш код завершился:
if(!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
Переключение на 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;
}
}
Как я интерпретирую комментарии, вы можете заменить эту функцию следующим сравнением:
inetAddress instanceof Inet4Address
чтобы ваш код завершился:
if(!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
Я не мог найти что-то лучше, чем преобразовать в 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. Просто удалите неизменяемую аннотацию, которая не очень важна, и она скомпилируется!
Чтобы использовать эту библиотеку в SDK 23, добавьте следующую строку в файл build.gradle проекта:
useLibrary 'org.apache.http.legacy'
Использование try catch как логики является ужасной практикой и должно выполняться только в случае, если это абсолютно неизбежно.
Используйте что-то вроде этого:
if (inetAddress instanceof Inet4Address){
//do something
}