Intereting Posts
Ошибка сборки Android с помощью build.xml: 479: в SDK нет встроенных средств сборки Как окрасить часть TextView в Android? Как управлять DialogFragment с помощью RxJava? Можно ли выполнять команды adb через приложение для Android? Android: Скрытие клавиатуры в переопределенном «Готово» нажатии EditText Не удается запустить приложение в Android Studio 2.0 Preview Как использовать платную версию моего приложения в качестве «ключа» для бесплатной версии? CursorLoader, получить URI для локальной базы данных Android-клавиатура с Emoji Не может комбинировать пользовательские заголовки с другими функциями заголовка Как программно добавлять кнопки в макет по одному в нескольких строках? Android Espresso, пробуждение устройства перед тестированием. Как использовать пользовательский манифест для тестирования? Как установить GridView внутри ScrollView Android Place Picker закрывается сразу после запуска Обработка события выключения телефона в android

Как получить IP_ADDRESS в формате IPV4

Я пытаюсь получить IP-адрес устройства, то есть используя WIFI или 3G-соединение. Я получаю ip-адрес в формате IPV6, что непонятно. Я хочу в IP-адресе IPV4. Я сделал google, но нашел правильные решения.

Вот код, который я использую, чтобы получить IP-адрес устройства

public String getLocalIpAddress() { try { try { for (Enumeration<NetworkInterface> en = NetworkInterface .getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); System.out.println("ip1--:" + inetAddress); System.out.println("ip2--:" + inetAddress.getHostAddress()); if (!inetAddress.isLoopbackAddress()) { String ip = inetAddress.getHostAddress().toString(); System.out.println("ip---::" + ip); EditText tv = (EditText) findViewById(R.id.ipadd); tv.setText(ip); return inetAddress.getHostAddress().toString(); } } } } catch (Exception ex) { Log.e("IP Address", ex.toString()); } return null; } 

Я получаю этот вывод:

 ip1--:/fe80::5054:ff:fe12:3456%eth0%2 ip2--:fe80::5054:ff:fe12:3456%eth0 

Он должен отображаться следующим образом:

 192.168.1.1 

Пожалуйста, помогите мне ..

Solutions Collecting From Web of "Как получить IP_ADDRESS в формате IPV4"

Попробовал много трюков. Наконец, я могу получить IP-адрес в формате IPV4. Вот мой код ..

 public String getLocalIpAddress() { try { for (Enumeration<NetworkInterface> en = NetworkInterface .getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf .getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); System.out.println("ip1--:" + inetAddress); System.out.println("ip2--:" + inetAddress.getHostAddress()); // for getting IPV4 format if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4 = inetAddress.getHostAddress())) { String ip = inetAddress.getHostAddress().toString(); System.out.println("ip---::" + ip); EditText tv = (EditText) findViewById(R.id.ipadd); tv.setText(ip); // return inetAddress.getHostAddress().toString(); return ip; } } } } catch (Exception ex) { Log.e("IP Address", ex.toString()); } return null; } 

Добавлено, если условие, как показано ниже

  /**This shows IPV4 format IP address*/ if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4 = inetAddress.getHostAddress())){} 

вместо этого

  /**This shows IPV6 format IP address*/ if (!inetAddress.isLoopbackAddress()){} 

Много спасибо .. Rahul

Альтернативой для проверки адреса является адрес версии 4:

 if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) 

Вы не можете предположить, что какое-либо устройство имеет только один сетевой адрес. Вы также не можете предположить, что он будет иметь любой IPv4 – он может быть только IPv6, поэтому ваше приложение должно будет иметь возможность обрабатывать как IPv4, так и IPv6-адреса.

Как правило, на Android-телефоне есть по крайней мере два интерфейса, которые назначают используемые ip-адреса, rmnet0 для данных 3G, которые для IPv4 часто являются несущими класса NAT и поэтому не могут принимать входящие соединения сокетов и могут также иметь IPv6-адрес; И wlan0 для Wi-Fi, который будет иметь любые IPv4 и / или IPv6-адрес, с которыми он может договориться с сетью, к которой он подключается.

Некоторые версии Android намеренно упускают (обычно более дорогостоящую) ссылку rmnet0 при подключении к Wi-Fi – в попытке уменьшить использование 3G-данных. Такое поведение является проблемой, когда Wi-Fi подключен к тому, что является невольным порталом, для которого требуется ручной вход.

Кажется, в Java API для IPv4-адресов есть отдельный класс Inet4Address .