连接到已配置的网络时,Android WiFi管理器网络交换机

时间:2018-01-22 09:41:10

标签: android android-wifi android-networking wifimanager

在最新版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会回家并检查网络是否有互联网。

但我无法弄清楚为什么只有当网络先前从设置连接时才会发生这种情况 - >无线上网

对于这篇冗长的帖子感到抱歉,如果有人知道为什么会发生这种情况,如果有任何方法可以阻止它,我会非常感激。请注意,无法更新M及更高版本的WiFi配置。此外,禁用网络也没有帮助。同样有趣的是,这只发生在一个像素上,而不是在三星设备上(没有网络代理?)。

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题。

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

似乎Google认为如果您使用的是IOT设备-您应该有一个应用程序来处理此连接和设备使用情况。 “设置”中的默认应用仅适用于Internet设备。

这似乎是干净Android的默认行为。我认为三星(可能还有其他一些公司)故意改变了这种行为,因为三星有很多可以通过这种方式从智能家居线路连接到手机的设备-只是为了让最终用户更舒适。 >

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

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

最明显的一个方法是使用反射和常规操作来更改NetworkAgentInfo.java的行为-更改滞留并避免使用BadBadWiFi之类的东西-对此需要进行一些调查,以确切地更改哪些内容。

反射方法可用于更改WifiManager的行为-例如,您可以通过反射调用forgetNetwork(int netId)方法,如果通过设置手动添加了网络,则忘记了网络-> WiFi并重新连接一次通过您的应用获得更多信息。您可以将其设置为尽可能安静,以使用户不知道此引擎盖下的厨房。

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

如果您正在为特定设备开发-将其root并更改默认的WiFi设置-虽然这是非常彻底的解决方案,但它是非常有限的一种。此外,要了解在.smali基础架构中的工作方式,还需要进行大量学习。

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

最后但并非最不重要的-您可以创建“优美的秋天”流程。这意味着,在出现上述情况的情况下,您将做好准备-在应用中创建一个流程,通过手动解决问题的方式导航用户。我相信这也是最正确的方法。但同时它也是最不友好的用户。 (我在应用程序中使用了这种方法-我要求用户手动忘记该点,然后在应用程序内重新扫描一次...(我知道的标签))

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