Поэтому следует учитывать, что Formatter.formatIpAddress(int) устарел:
Этот метод устарел на уровне API 12. Используйте getHostAddress(), который поддерживает адреса IPv4 и IPv6. Этот метод не поддерживает адреса IPv6.
Таким образом, использование formatIpAddress(int)
, вероятно, не является хорошим долгосрочным решением, хотя оно будет работать.
Вот потенциальное решение, если вы хотите получить IP-адрес для интерфейса WiFi:
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 следующее:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Обратите внимание, что это только пример решения. Вы должны потратить время на проверку нулевых значений и т. д., чтобы убедиться, что UX работает гладко.
Ирония заключается в том, что, с одной стороны, Google отказывается от поддержки formatIpAddress(int)
, но по-прежнему имеет getIpAddress() по-прежнему возвращает целочисленное значение. IP-адрес, являющийся целым числом, также исключает его совместимость с IPv6.
Далее следует тот факт, что порядок байтов может быть проблемой, а может и не быть. Я протестировал только три устройства, и все они были с прямым порядком байтов. Кажется, порядок следования байтов может варьироваться в зависимости от оборудования, даже если мы работаем на виртуальных машинах, это все еще может быть проблемой. Поэтому, чтобы быть в безопасности, я добавил в код проверку порядка байтов.
getByAddress(byte[]) выглядит так: хотите, чтобы целочисленное значение было с обратным порядком байтов. Из исследования этого видно, что сетевой порядок байтов имеет обратный порядок байтов. Имеет смысл, поскольку адрес вроде 192.168.12.22 является числом с обратным порядком байтов.
Ознакомьтесь с проектом HammerNet на GitHub. Он реализует приведенный выше код вместе с кучей проверок работоспособности, возможностью обработки значений по умолчанию для AVD, модульных тестов и других вещей. Мне пришлось реализовать это для моего приложения, и я решил открыть библиотеку.
person
pedrohdz
schedule
05.09.2013