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;
}
}
私がコメントから解釈するように、その関数をこの比較で置き換えることができます:
inetAddress instanceof Inet4Address
だからあなたのコードはで終わるでしょう:
if(!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
build.gradle(Module:app)ファイルに以下を追加します、
Android {useLibrary 'org.Apache.http.legacy'}
SDK 23でこのライブラリを使用するには、プロジェクトのbuild.gradleファイルに次の行を追加します。
useLibrary 'org.Apache.http.legacy'
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でサポートされている正規表現クラスを使用します。それほど重要ではない不変のアノテーションを削除するだけで、コンパイルされます!
ロジックとしてのトライキャッチの使用は恐ろしい習慣であり、完全にやむを得ない場合にのみ実行する必要があります。
代わりに次のようなものを使用してください:
if (inetAddress instanceof Inet4Address){
//do something
}