我想开发一个应用程序,除非我批准,否则它会阻止连接到 WiFi 网络。我希望能够查询接入点的 MAC 地址,并将其与对应于 SSID 的已知地址列表进行比较。该应用程序的目标是防止用户意外连接到恶意访问点,例如可以使用 pineapple devices 生成的类型.
我的研究并不清楚我将如何实现这一目标。 How to be notified on wifi network status change?等问题解释如何检测连接已经发生,但是对于我的用例来说已经太晚了。
ConnectivityManager
和 WifiManager
似乎都没有提供添加可能会中断正在进行的连接的监听器的方法。
我对解决方案的一些想法:
将自己安装为代理并决定是否允许数据通过。但是,这似乎不是基于 Do Android proxy settings apply to all apps on the device? 的选项。 (提示:答案是“否”)。
用我自己创建的东西替换现有的 WiFi 管理器。但是,我真的很难在 Android 开发人员指南中找到有关更换系统组件的任何信息。因此,我不确定这在非 root 手机上是否可行。
将网络密码存储在我的应用程序中,并将 WiFi 管理器中的密码设置为无意义的值。然后捕获一条警告连接失败的广播消息(大概类似于。我突然想到菠萝设备可能会接受任何密码,因此这种方法无效。WifiManager.WPS_AUTH_FAILURE
)并有选择地决定重新连接回该网络。可能是一个可能的(如果丑陋的)解决方案,但我可以在网络仍然连接时将密码设置回无意义的值,以确保我们不会悄悄地连接到另一个同名的 SSID?我不确定想办法阻止 Android 自动连接到已知网络(即以前使用过的网络或存储有密码的网络)。然后我可以管理我的应用程序的所有连接/断开连接。但是,我看不到如何在手机上手动执行此操作,因此我怀疑这是否可以通过编程方式实现。
任何人都可以提出一种适用于非 root 手机的方法吗?
最佳答案
如果不给设备root,你就无法实现一个非常强大的系统。我认为这是你能得到的最接近的:
- 使用 getConfiguredNetworks()获取用户设备上当前配置的网络列表
- 对于每个 WifiConfiguration在列表中,设置公共(public)字段BSSID到所需的“安全”MAC 地址
- 调用 saveConfiguration()持久化更改
或者,对于步骤 (2.),您可以调用 disableNetwork()为每个配置的网络,并根据 BSSID 有选择地启用它们。请注意,MAC 地址仍然很容易被欺骗。
关于java - 除非我的应用程序批准,否则阻止 Android 手机连接到 WiFi 网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26687211/