Android API-23: InetAddressUtils 替换
Android API-23: InetAddressUtils replacement
切换到 Android Marshmallow API,我在代码中使用 org.apache.http.conn.util.InetAddressUtils
for InetAddressUtils.isIPv4Address(ipAddress)
列出设备的所有 IP。
作为 API-23 changes 的一部分,InetAddressUtils
class 现已消失。
现在如何替换下面的代码?
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) {
2020 年更新
请记住,您的用户也可以启用 IPv6。在这种情况下,您还需要检查 Inet6Address
。
我找不到比转换为 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 支持的正则表达式 类。只需删除不是很重要的不可变注释,它就会编译!
使用 try catch 作为逻辑是一种可怕的做法,只有在完全不可避免的情况下才应该这样做..
改用这样的东西:
if (inetAddress instanceof Inet4Address){
//do something
}
要在 SDK 23 中使用此库,请在项目的 build.gradle 文件中添加以下行:
useLibrary 'org.apache.http.legacy'
将以下内容添加到您的 build.gradle(Module:app) 文件中,
android {
useLibrary 'org.apache.http.legacy'
}
切换到 Android Marshmallow API,我在代码中使用 org.apache.http.conn.util.InetAddressUtils
for InetAddressUtils.isIPv4Address(ipAddress)
列出设备的所有 IP。
作为 API-23 changes 的一部分,InetAddressUtils
class 现已消失。
现在如何替换下面的代码?
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) {
2020 年更新
请记住,您的用户也可以启用 IPv6。在这种情况下,您还需要检查 Inet6Address
。
我找不到比转换为 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 支持的正则表达式 类。只需删除不是很重要的不可变注释,它就会编译!
使用 try catch 作为逻辑是一种可怕的做法,只有在完全不可避免的情况下才应该这样做..
改用这样的东西:
if (inetAddress instanceof Inet4Address){
//do something
}
要在 SDK 23 中使用此库,请在项目的 build.gradle 文件中添加以下行:
useLibrary 'org.apache.http.legacy'
将以下内容添加到您的 build.gradle(Module:app) 文件中,
android { useLibrary 'org.apache.http.legacy' }