连接到已配置的网络时,Android WiFi Manager网络开关

esw*_*arm 5 android android-networking wifimanager android-wifi

在最新版本的Android(特别是在Pixel上)上与Wifi Manager交互时,我看到一些有趣的行为。我正在尝试使WIFI管理器连接到已知的热点(IOT设备)。

Google在博客文章中清楚地列出了步骤,如果您使用的是棒棒糖,则需要绑定到特定的网络以确保您的网络请求通过给定的网络传递。可以在这里找到步骤https://android-developers.googleblog.com/2016/07/connecting-your-app-to-wifi-device.html

列出的步骤在正常情况下可以正常工作(您可以通过扫描搜索接入点并进行添加网络,因为之前没有进行配置)。但是,如果接入点是从Wifi列表中手动连接的,则添加网络将会失败(从Android M及更高版本开始,您将无法更改由其他应用或系统完成的wifi配置),而我必须连接至已配置的网络。这种情况总是会在大约20-30秒后导致网络切换。

我认为这是由https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java引起的,因为Google打电话回家并检查是否网络有互联网。

但是我不知道为什么只有在以前通过“设置”->“ Wifi”连接网络时才会发生这种情况

很抱歉,如果有人知道为什么会发生这种长篇大论的帖子,并且有任何阻止它的方法,我们将不胜感激。请注意,无法在M及更高版本上更新wifi配置。另外,禁用网络也无济于事。同样有趣的是,这仅发生在像素上,而不发生在Samsung设备上(没有网络代理?)。

Pav*_*sha 1

我遇到过类似的问题。

我可能只假设通过 Android 系统中的“设置”->“WiFi”进行手动连接默认被视为互联网连接,如果特定 WiFi 网络上没有互联网,它会尝试将其切换到具有此连接的网络。

谷歌似乎认为,如果您使用物联网设备,您应该有一个应用程序来处理此连接和设备使用。设置中的默认应用程序仅适用于互联网事物。

看来这是干净的 Android 的默认行为。我认为三星(也许还有其他一些人)故意改变了这种行为,因为他们有很多设备可以通过这种方式从他们的智能家居产品线连接到手机 - 只是为了让最终用户更舒服。

从开发人员的角度来看 - 由于专有和其他东西,你无能为力......

但总有一种方法可以尝试。

最明显的一个是使用反射和正常操作来改变 NetworkAgentInfo.java 的行为 - 改变延迟并避免 BadWiFi 之类的东西 - 这需要一些关于到底应该改变什么的调查。

反射方法可用于改变WifiManager行为 - 例如,forgetNetwork(int netId)如果通过“设置”->“WiFi”手动添加网络,您可以通过反射调用该方法并忘记网络,然后通过您的应用程序再次重新连接。您可以使其尽可能安静,以免用户意识到这个引擎盖下的厨房。

反射的缺点是您可能必须为不同版本的 Android 创建不同的方法,甚至可能为不同的设备创建不同的方法(希望不是)

如果您正在针对特定设备进行开发 - 对其进行 root 并更改默认 WiFi 设置 - 这虽然是一种非常激进的解决方案,但也具有很大的局限性。此外,它还需要相当长的学习曲线才能了解您在.smali基础设施方面的方式。

另一件事 - 如果您的手机和设备支持此协议,您可以使用 WiFi direct WifiP2pManager。我不会在这一点上停留太多,因为它是特定于设备的。

最后但并非最不重要的一点 - 您可以创建“优雅的坠落”流程。这意味着,在出现所描述的情况时,您将做好准备 - 在您的应用程序中创建一个流程,引导用户手动解决问题。我相信这也是最正确的方法。但同时它也是对用户最不友好的一种。(我在我的应用程序中使用了这种方法 - 我要求用户手动忘记该位置并在应用程序内再次重新扫描......(我知道很蹩脚))

很抱歉冗长的答案,基于假设而不是实际数据,并且没有具体的解决方案,但我希望它能以某种方式帮助你......