我已经写了HTC渴望一个应用程序,它获取设备的IP地址,并将其打印到屏幕上。 当我安装这个程序,我的标签10.1 IP地址的信件和数字在一个陌生的格式出来?
private String getIpAddress()
{
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();
if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); }
}
}
}
catch(SocketException ex)
{
Log.e(TAG , ex.toString());
}
return null;
}
什么是标签10.1有什么不同?
(IP返回 - FE80 :: be47:60ff:FEFF:21e2)
需要有一个IP地址,因为这是我传递到PC上的终端连接到我的应用程序。
你的Galaxy Tab 10.1接收IPv6地址,在这种情况下fe80::be47:60ff:feff:21e2
。 这可能是由有关IPv6的不同喜好或你的HTC Desire的能力和Galaxy Tab的造成的。
有什么不妥,越来越多的设备会(有)使用IPv6地址,当IPv4地址空间耗尽。
作为尼西姆在他对这个问题的评论指出,IPv6的地址开始fe80:
是链路本地地址 ,即地址范围的设备自我分配,如果它没有连接到转手出去的地址的任何网络,例如通过DHCP。
因此,它看起来像你的Galaxy Tab没有连接到任何WiFi网络或者不接受通过DHCP的地址。
在问题的代码片段返回它发现与没有过滤掉的链路本地地址(其不是从外部连接有用)的首地址。 下面的代码给你既不回送,也不链路本地所有地址。 你怎么许多人之间进行选择是由你 - 我真的不知道:
private static List<InetAddress> getIpAddress() {
try {
List<InetAddress> result = new ArrayList<InetAddress>();
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface intf = interfaces.nextElement();
Enumeration<InetAddress> addresses = intf.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress address = addresses.nextElement();
if (!address.isLoopbackAddress() && !address.isLinkLocalAddress()) {
result.add(address);
}
}
}
return result;
} catch (SocketException ex) {
Log.e(TAG, "Failed to list network interfaces.", ex);
return null;
}
}
为了便于比较,我的Windows系统列出23个网络接口(其中大多数是虚拟的)共10个地址,其中2个是环回地址(本地主机),4链路本地地址 - 离开4不会忽略上面的代码会返回 - 采摘第一个似乎过于乐观。