Как получить IP-адрес в формате IPV4
Я пытаюсь получить IP-адрес устройства i.e использование WIFI или 3G-соединения. Я получаю ip-адрес в формате IPV6, который не понятен. Я хочу IP-адрес в формате IPV4.Я сделал google, но dint нашел правильные решения.
вот код, который я использую для получения 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;
}
Я получаю это ouput:
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()){}
Большое Спасибо.. Рахул!--5-->
альтернативой для проверки, является ли адрес адресом версии 4, является:
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address)
вы не можете предположить, что любое устройство имеет только один сетевой адрес. Вы также не можете предположить, что он будет иметь IPv4 - это может быть только IPv6, поэтому ваше приложение должно будет иметь возможность обрабатывать как IPv4, так и IPv6-адреса.
Как правило, телефон Android имеет по крайней мере два интерфейса, которым назначаются полезные ip-адреса, rmnet0 для данных 3G, которые для IPv4 часто являются носителями и поэтому не могут принимать входящие соединения сокетов, а также могут иметь IPv6 адрес; и wlan0 для wifi, который будет иметь любой IPv4 и/или IPv6-адрес, который он может согласовать с сетью, к которой он присоединяется.
некоторые версии Android намеренно отбрасывают (как правило, более дорогую) ссылку rmnet0, когда она подключается к wifi-в попытке уменьшить использование данных 3G. Такое поведение является проблемой, когда wifi подключен к чему-то, что является пленным порталом, который требует ручного входа.