获取我的无线networking地址Android

在WiFi下连接时,如何获取手机的IP地址?

我在这里find了一个方法,但是它返回类似于24.182.239.255的东西,即使我在wifi下,我也期望类似192.168.1.10。

我想要这样的东西:

if (you are under wifi) String ip4 = getWifiIP() else String ip4 = getIPAddress with the method linked before 

非常感谢!

如果您希望在连接到Wi-Fi时获取设备的私有IP地址,则可以尝试此操作。

 WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); int ip = wifiInfo.getIpAddress(); String ipAddress = Formatter.formatIpAddress(ip); 

一定要添加权限

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

到你的清单。

所以需要考虑的是Formatter.formatIpAddress(int)被弃用:

此方法在API级别12中已弃用。使用getHostAddress(),它同时支持IPv4和IPv6地址。 此方法不支持IPv6地址。

所以使用formatIpAddress(int)可能不是一个好的长期解决scheme,尽pipe它可以工作。

这是一个潜在的解决scheme,如果你正在寻找绝对的WiFi接口的IP地址:

 protected String wifiIpAddress(Context context) { WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE); int ipAddress = wifiManager.getConnectionInfo().getIpAddress(); // Convert little-endian to big-endianif needed if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) { ipAddress = Integer.reverseBytes(ipAddress); } byte[] ipByteArray = BigInteger.valueOf(ipAddress).toByteArray(); String ipAddressString; try { ipAddressString = InetAddress.getByAddress(ipByteArray).getHostAddress(); } catch (UnknownHostException ex) { Log.e("WIFIIP", "Unable to get host address."); ipAddressString = null; } return ipAddressString; } 

如前面的回复所述,您需要在AndroidManifest.xml中设置以下内容:

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

请注意,这只是一个示例解决scheme。 您应该花时间检查空值等,以确保用户体验平稳。

具有讽刺意味的是,一方面Google不赞成使用formatIpAddress(int) ,但getIpAddress()仍然返回一个整数值。 作为一个int的IP地址也排除了符合IPv6的要求。

接下来的事实是,字节序可能会或可能不是一个问题。 我只testing了三种设备,它们都是小端的。 似乎endianness可以根据硬件而有所不同,即使我们在虚拟机上运行,​​这仍然是一个问题。 所以为了安全起见,我在代码中添加了一个endian检查。

getByAddress(byte [])似乎希望整数值是大端。 从研究这个看来,networking字节顺序是大端的。 有意义的,因为像192.168.12.22这样的地址是一个大端的数字。


查看HammerNet GitHub项目。 它实现了上面的代码以及一系列的理智检查,能够处理AVD默认值,unit testing等等。 我不得不实施这个为我的一个应用程序,并决定开源图书馆。

这将让你的WiFi IPv4,IPv6或两者兼而有之。

 public static Enumeration<InetAddress> getWifiInetAddresses(final Context context) { final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); final WifiInfo wifiInfo = wifiManager.getConnectionInfo(); final String macAddress = wifiInfo.getMacAddress(); final String[] macParts = macAddress.split(":"); final byte[] macBytes = new byte[macParts.length]; for (int i = 0; i< macParts.length; i++) { macBytes[i] = (byte)Integer.parseInt(macParts[i], 16); } try { final Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); while (e.hasMoreElements()) { final NetworkInterface networkInterface = e.nextElement(); if (Arrays.equals(networkInterface.getHardwareAddress(), macBytes)) { return networkInterface.getInetAddresses(); } } } catch (SocketException e) { Log.wtf("WIFIIP", "Unable to NetworkInterface.getNetworkInterfaces()"); } return null; } @SuppressWarnings("unchecked") public static<T extends InetAddress> T getWifiInetAddress(final Context context, final Class<T> inetClass) { final Enumeration<InetAddress> e = getWifiInetAddresses(context); while (e.hasMoreElements()) { final InetAddress inetAddress = e.nextElement(); if (inetAddress.getClass() == inetClass) { return (T)inetAddress; } } return null; } 

用法:

 final Inet4Address inet4Address = getWifiInetAddress(context, Inet4Address.class); final Inet6Address inet6Address = getWifiInetAddress(context, Inet6Address.class); 

别忘了:

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

如果在terminal中安装了adb,请执行以下操作:

 Runtime.getRuntime.exec("adb", "shell", "getprop", "dhcp.wlan0.ipaddress"); 

基于我的崩溃日志,似乎并不是每个设备都会返回WiFi mac地址。

这是最stream行的回复清洁版本。

 final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); final ByteBuffer byteBuffer = ByteBuffer.allocate(4); byteBuffer.order(ByteOrder.LITTLE_ENDIAN); byteBuffer.putInt(wifiInfo.getIpAddress()); try { final InetAddress inetAddress = InetAddress.getByAddress(null, byteBuffer.array()); } catch (UnknownHostException e) { //TODO: Return null? } 

Formatter.formatIpAddress(int)已弃用:

 WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); String ipAddress = BigInteger.valueOf(wm.getDhcpInfo().netmask).toString();