Android API-23: InetAddressUtils replacement

夙愿已清 提交于 2019-12-03 11:13:10

问题


Switching to Android Marshmallow API, I was using org.apache.http.conn.util.InetAddressUtils for InetAddressUtils.isIPv4Address(ipAddress) in a code to list all IPs from a device.

As part of the API-23 changes, the InetAddressUtils class is now gone.

How can I replace the below code now?

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

回答1:


Like I interprete from the comments you can replace that function with this comparison:

inetAddress instanceof Inet4Address

so your code would end in:

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



回答2:


Add below to your build.gradle(Module:app) file,

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




回答3:


To use this library in SDK 23 add following line in project's build.gradle file:

useLibrary 'org.apache.http.legacy'



回答4:


I couldn't find something better than converting to Inet4Address or 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;
     } 
}

Note, the getHostByName actually does the lookup, which isn't always desirable.

Or, you can get source of InetAddessUtils, which unlike getByName(), doesn't do the lookup, but accepts only dotted addresses. The code is really tiny. It uses regexp classes which are supported by Android. Just remove Immutable annotation which isn't really important, and it will compile!




回答5:


Using try catch as logic is horrible practice and should only be done if totally unavoidable..

Use something like this instead:

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


来源:https://stackoverflow.com/questions/32141785/android-api-23-inetaddressutils-replacement

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!