web-dev-qa-db-ja.com

Android API-23:InetAddressUtilsの置き換え

Android Marshmallow APIに切り替え、デバイスからすべてのIPをリストするコードでInetAddressUtils.isIPv4Address(ipAddress)org.Apache.http.conn.util.InetAddressUtilsを使用していました。

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

私がコメントから解釈するように、その関数をこの比較で置き換えることができます:

inetAddress instanceof Inet4Address

だからあなたのコードはで終わるでしょう:

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

build.gradle(Module:app)ファイルに以下を追加します、

Android {useLibrary 'org.Apache.http.legacy'}

4
dgamer

SDK 23でこのライブラリを使用するには、プロジェクトのbuild.gradleファイルに次の行を追加します。

useLibrary 'org.Apache.http.legacy'
3
Tarun

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でサポートされている正規表現クラスを使用します。それほど重要ではない不変のアノテーションを削除するだけで、コンパイルされます!

2
cyanide

ロジックとしてのトライキャッチの使用は恐ろしい習慣であり、完全にやむを得ない場合にのみ実行する必要があります。

代わりに次のようなものを使用してください:

if (inetAddress instanceof Inet4Address){
    //do something
}  
1
Daniel Harvey