ので、考慮すべき何かがFormatter.formatIpAddress(int)は廃止されていることである。
この方法は、IPv4とIPv6の両方のアドレスをサポートしているAPIレベル12 利用はgetHostAddress()で廃止されました。このメソッドはIPv6アドレスをサポートしていません。
したがって、formatIpAddress(int)
を使用すると、長期的な解決策にはならない可能性がありますが、それはうまくいくでしょう。前回の回答で述べたように
protected String wifiIpAddress(Context context) {
WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
int ipAddress = wifiManager.getConnectionInfo().getIpAddress();
// Convert little-endian to big-endianif needed
if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) {
ipAddress = Integer.reverseBytes(ipAddress);
}
byte[] ipByteArray = BigInteger.valueOf(ipAddress).toByteArray();
String ipAddressString;
try {
ipAddressString = InetAddress.getByAddress(ipByteArray).getHostAddress();
} catch (UnknownHostException ex) {
Log.e("WIFIIP", "Unable to get host address.");
ipAddressString = null;
}
return ipAddressString;
}
、あなたはのAndroidManifest.xmlに以下のように設定する必要があります。ここでは
あなたは絶対に無線LANインターフェイスのIPアドレスを取得するために探している場合の潜在的なソリューションです:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
これはほんの一例です。ヌル値などをチェックしてUXがスムーズであることを確認する時間が必要です。
一方、GoogleではformatIpAddress(int)
を非難していますが、依然としてgetIpAddress()はまだ整数値を返しています。 IPアドレスがintであることも、IPv6に準拠しているためにそれを排除します。
次は、エンディアンが問題であるかどうかです。私は3つのデバイスしかテストしておらず、彼らはすべてリトルエンディアンでした。私たちがVMで動作していてもエンディアンはハードウェアによって異なるかもしれませんが、これは依然として問題となります。安全側にいるために、私はコード内にエンディアンチェックを追加しました。
getByAddress(byte[])は、整数値をビッグエンディアンにしたいと思われます。これを調べることで、ネットワークのバイトオーダーはビッグエンディアンに見えます。 192.168.12.22のようなアドレスはビッグエンディアンなので意味があります。
HammerNet GitHubプロジェクトを参照してください。上記のコードは、一連の健全性チェック、AVD、ユニットテストなどのデフォルトの処理能力とともに実装されています。私はこれを私のアプリ用に実装しなければならず、ライブラリをオープンソースにすることに決めました。
あなたはプライベートIPを期待しているようです。これは役に立ちます。 http://stackoverflow.com/questions/6064510/how-to-get-ip-address-of-the-device –