Подтвердить что ты не робот

Как получить 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

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

4b9b3361

Ответ 1

После нескольких попыток. Наконец, я могу получить 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()){}

Большое спасибо.. Рахул

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

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

Ответ 2

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

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

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

Ответ 3

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