获取我的无线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();
- Android TextView setTextSize不正确地增加文字大小
- 在Android应用程序中使用Intent来显示另一个活动
- getSupportFragmentManager()和getChildFragmentManager()有什么区别?
- 当使用CoordinatorLayout时,我的ScrollView的大小不正确
- 未find名称为“default”的Android Studio Gradleconfiguration
- 如何正确下载图像?
- Android xml错误:使用RelativeLayout(@ id / LinearLayout_acc,@ id / ProgressBar_statusScreen)发现“找不到与给定名称匹配的资源”
- 如何检查Android权限是否被实际使用?
- RelativeLayout比LinearLayout更昂贵吗?