切换到Android Marshmallow API,我在代码中使用了InetAddressUtils.isIPv4Address(ipAddress)
的org.apache.http.conn.util.InetAddressUtils
来列出设备上的所有IP。
作为API-23 changes的一部分,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;
}
}
发布于 2015-08-30 08:09:05
我找不到比转换成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()不同,它不执行查找,但只接受以点分隔的地址。代码真的很小。它使用Android支持的regexp类。只需删除不太重要的不可变注释,它就会编译!
发布于 2016-09-29 13:32:58
要在SDK23中使用该库,请在项目的build.gradle文件中添加以下行:
useLibrary 'org.apache.http.legacy'
发布于 2016-04-27 22:44:07
使用try catch作为逻辑是一种可怕的做法,只有在完全无法避免的情况下才应该这样做。
改用下面这样的代码:
if (inetAddress instanceof Inet4Address){
//do something
}
https://stackoverflow.com/questions/32141785
复制相似问题