我试图获取设备的IP地址,即使用WIFI或3G连接。我收到了IPV6格式的IP地址,这是不可理解的。我想要IPV4格式的IP地址。我做了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;
}
我得到了这个输出:
ip1--:/fe80::5054:ff:fe12:3456%eth0%2
ip2--:fe80::5054:ff:fe12:3456%eth0
它应该显示如下:
192.168.1.1
请帮帮我..
答案 0 :(得分:47)
尝试了很多技巧..最后我可以获得IPV4格式的IP地址..这是我的代码..
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;
}
添加 if 条件,如下所示
/**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)
答案 1 :(得分:8)
您不能假设任何设备只有一个网络地址。您也不能假设它将具有任何IPv4 - 它可能只是IPv6,因此您的应用程序将需要能够处理IPv4和IPv6地址显示。
通常情况下,Android手机至少有两个接口可以分配可用的IP地址,rmnet0用于3G数据,对于IPv4通常是运营商级NAT,因此不能接受传入的套接字连接,也可能有IPv6地址;和wlan0用于wifi,它将具有与它所连接的网络协商的任何IPv4和/或IPv6地址。
某些版本的Android会在连接到wifi时故意丢弃(通常更昂贵的)rmnet0链接 - 试图减少3G数据的使用。当wifi附加到需要手动登录的强制门户网站时,这种行为是个问题。
答案 2 :(得分:2)
似乎在Java API for IPv4地址中有一个单独的类Inet4Address。
答案 3 :(得分:0)
以下是一种检查IPv4或IPv6的简单方法:
InetAddress address = InetAddress.getByName(ip);
if (address instanceof Inet6Address) {
// It's ipv6
} else if (address instanceof Inet4Address) {
// It's ipv4
}