当前位置: 首页 > 知识库问答 >
问题:

Android WiFi管理器网络切换时连接到配置的网络

狄安歌
2023-03-14

在最新版本的Android(尤其是Pixel)上处理Wifi Manager时,我看到了一些有趣的行为。我正在尝试使WIFI manager连接到已知的热点(IOT设备)。

谷歌在一篇博客文章中清楚地列出了这些步骤,如果你在Lollipop上,你需要绑定到一个特定的网络,以确保你的网络请求通过一个给定的网络。你可以在这里找到步骤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。因为谷歌打电话回家,检查网络是否有互联网。

但是我不明白为什么只有当网络以前通过设置连接时才会发生这种情况-

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

共有1个答案

景明诚
2023-03-14

我也遇到过类似的问题。

我可能只会假设通过设置手动连接-

在谷歌看来,如果你正在使用物联网设备,你应该有一个应用程序来处理这种连接和设备使用。“设置”中的默认应用程序仅适用于互联网内容。

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

开发人员的角度来看,由于专有技术和其他东西。。。

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

最明显的是使用反射和正常操作来改变NetworkAgentInfo的行为。java——改变挥之不去的东西和avoidBadWiFi之类的东西——需要对到底应该改变什么进行一些调查。

反射方法可用于改变WifiManager行为-例如,您可以通过反射调用forgetNetwork(int netId)方法,如果通过设置手动添加网络,则可以忘记网络-

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

如果您正在为特定设备开发—根目录并更改默认WiFi设置—这是一个非常激进的解决方案,而且非常有限。此外,要了解您在中的学习方式,还需要相当长的学习曲线。smali基础设施。

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

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

很抱歉,这个冗长的答案是基于假设而非实际数据,没有具体的解决方案,但我希望它能在某种程度上帮助你。。。

 类似资料:
  • 3.a. 您可以不联网安装, 不过... 谁可以不用联网? 取决于您先前选择的用以安装 gentoo 的媒介, 您将可以或不可以不联网安装. 我们可没和您开玩笑哦 =) 普遍而言, 您需要配置网络连接. 不过呢, Gentoo 也提供了离线安装的可能性. 只要您选择使用 Gentoo Universal LiveCDs. 我为啥需要联网? 联网安装的一大好处就是您可以得到一个最新的系统. 您会得到

  • 问题内容: 我正在尝试使用Java设置网络超时我的Oracle数据库连接。但是,我遇到了错误。以下是示例代码及其各自的例外。 我得到的异常是: 我相信这与抽象方法有关(请参见AbstractMethodError)。可能导致此错误的原因是我只实现了我认为已经在Java中定义的方法,因此不拒绝编译。 注意:如果有抽象方法,Java不允许编译具体的类。 问题答案: 是JDBC 4.1中引入的,而JDB

  • TL;DR(原文的这些个符号,几个意思?) Dockers启动后,会在宿主机上创建名为docker0的虚拟网卡,并给docker0随机分配一个宿主机没有使用,且满足RFC 1918定义的私有网络地址和子网段。举例来说,在我做这个步骤时,Docker分配的子网段是172.17.42.1/16,(最后那个16是掩码,表示该子网段可以会为宿主机和容器提供65534个地址)。容器的MAC地址根据IP地址生

  • 使用 nmcli 配置网络 本部分使用 nmcli 命令配置网络,将默认的 DHCP 连接配置修改为静态配置。1 - 显示所有连接 $ nmcli connection show NAME UUID TYPE DEVICE eth0 9e02ed35-21b1-4edc-bc51-9cde226e0

  • Linux网络配置方法简介。 配置IP地址 # 使用ifconfig ifconfig eth0 192.168.1.3 netmask 255.255.255.0 # 使用用ip命令增加一个IP ip addr add 192.168.1.4/24 dev eth0 # 使用ifconfig增加网卡别名 ifconfig eth0:0 192.168.1.10 这样配置的IP地址重启机器后会丢失

  • 本文向大家介绍Docker容器的网络管理和网络隔离的实现,包括了Docker容器的网络管理和网络隔离的实现的使用技巧和注意事项,需要的朋友参考一下 一、Docker网络的管理 1、Docker容器的方式 1)Docker访问外网 Docker容器连接到宿主机的Docker0网桥访问外网;默认自动将docker0网桥添加到docker容器中。 2)容器和容器之间通信 需要管理员创建网桥;将不同的容器