20

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

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 に答える