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

Я пытаюсь получить IP-адрес устройства, например, используя WIFI или 3G-соединение. Я получаю IP-адрес в формате IPV6, который не понятен. Я хочу, чтобы в формате IPV4 IP-адрес. Я сделал 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

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

3 ответа

Решение

Попробовав много хитростей... наконец я могу получить 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)

Вы не можете предполагать, что любое устройство имеет только один сетевой адрес. Вы также не можете предполагать, что у него будет какой-либо 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 есть отдельный класс Inet4Address для адресов IPv4.

Ниже приводится простой способ проверить, IPv4 это или IPv6:

InetAddress address = InetAddress.getByName(ip);
if (address instanceof Inet6Address) {
    // It's ipv6
} else if (address instanceof Inet4Address) {
    // It's ipv4
}