20

切换到 Android Marshmallow API,我在代码中使用org.apache.http.conn.util.InetAddressUtilsforInetAddressUtils.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;
    }
}
4

5 回答 5

26

就像我从评论中解释的那样,您可以用这个比较替换该函数:

inetAddress instanceof Inet4Address

所以你的代码将以:

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

2020 年更新
请记住,您的用户也可以启用 IPv6。在这种情况下,您也需要检查Inet6Address

于 2015-08-24T09:02:29.337 回答
5

将以下内容添加到您的 build.gradle(Module:app) 文件中,

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

于 2018-03-16T06:22:35.900 回答
4

我找不到比转换为 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 支持的正则表达式类。只需删除不重要的 Immutable 注释,它就会编译!

于 2015-08-30T00:09:05.287 回答
3

要在 SDK 23 中使用此库,请在项目的 build.gradle 文件中添加以下行:

useLibrary 'org.apache.http.legacy'
于 2016-09-29T05:32:57.913 回答
1

使用 try catch 作为逻辑是可怕的做法,只有在完全不可避免的情况下才应该这样做。

改用这样的东西:

if (inetAddress instanceof Inet4Address){
    //do something
}  
于 2016-04-27T14:44:06.603 回答