领取MOLI红包

你的位置:Grin中文网 > Y8U中文网 >

Android连接指定Wifi的方法实例代码

发布日期:2025-01-04 18:18    点击次数:68
本篇文章主要记录一下Android中打开Wifi、获取Wifi接入点信息及连接指接入点的方法。 自己写的demo主要用于测试接口的基本功能,因此界面及底层逻辑比较粗糙。 demo的整体界面如下所示: 上图中的OPEN按键负责开启Wifi; GET按键负责获取扫描到的接入点信息。 当获取到接入点信息后,我选取了其中的名称及信号强度,以列表的形式显示在主界面下方,如下图: 当点击列表中的Item时,就会去连接对应的接入点。 自己的逻辑比较简单,测试时的代码,假定连接的是不许要密码或密码已知的接入点。 demo的布局文件就不介绍了,就是Button和RecyclerView。 主要记录一下,使用到的核心代码。 mMainRunnable的代码如下,主要用于判断Wifi是否开启成功。 这部分代码,主要使用了WifiManager的公有接口,开启Wifi开关及判断开启状态。 这部分操作需要的权限是: Get按键被点击后,对应的代码如下: 上面这部分代码也比较简单,主要利用WifiManager的getScanResults接口,获取终端探索到的接入点信息。 其中,sortList的代码如下: 这部分代码唯一需要注意的地方是,需要申明权限: 同时,在高版本中还需要主动获取运行时权限。 权限的要求,是由WifiServiceImpl的实现决定的,我们以Android 7.0为例,看看对应的代码: 获取到信息后,就可以显示和点击列表中的Item了。 由于自己使用的是RecyclerView,因此这部分工作全部交给了对应ViewHolder: 以上就是连接指定Wifi的基本套路,从代码中容易看出,关键问题是如何创建出有效的WifiConfiguration。 自己测试时,初始创建WifiConfiguration失败,手机怎么都没法连接到热点上,后来修改后,基本功能终于能够实现: 自己写完demo后,以一个手机建立热点,分别测试了有密码和无密码的场景(对应的,需要修改createWifiConfig的传入参数)。 发现demo运行的手机在两种场景下,均能够连接到指定热点。 Demo地址如下: https://github.com/ZhangJianIsAStark/Demos/tree/master/wifitest 在本文的最后,补充一下终端作为热点时的接口。 public boolean isWifiApEnabled() 具有@SystemApi、@hide注解的公有接口,判断手机的热点是否开启。 在Android 5.1之前,这个接口没有@SystemApi注解, 于是有很多代码会利用Java发射机制,获取该方法并判断手机热点是否开启。 现在那些老代码已经没法使用了。 现在的做法(以5.1以上为例),应该利用广播接收器监听WifiManager中定义的WIFI_AP_STATE_CHANGED_ACTION。 注意到该Action也有@SystemApi注解,所以要直接监听对应的字符串,示例如下(上面链接中的demo也有涉及): 我暂时没有深究Wifi模块开启AP的流程。 不过从自己的测试结果来看,Wifi开启或关闭AP时,推测发送的应该是Sticky类型的广播。 于是,只要APK注册了广播监听器,立马就会得到回复,明白当前AP的状态。 例如,我在开启AP后,再打开自己的测试Demo,立马会收到如下信息: 手动关闭AP后可以得到如下结果: @SystemApi,设置和获取Wifi-AP的配置信息。 可以看出不论手机作为AP还是STA,在Framework中均利用WifiConfiguration抽象对应的配置信息,包括鉴权算法、密码、SSID、协议等。 这种设计是符合802.11协议精神的,毕竟在物理设备的角度上,AP和STA是完全对等的。只不过在实际情况中,根据各自的需求,特质化了一些组件。 实际上从底层协议来看,仅在传输这个角度上,AP和STA的主要区别仅在于收到数据帧后的处理流程不同。AP收到数据帧后,发现目的地址不是自己,就会进入转发流程;而STA可能就直接丢弃该数据帧了。当然如果从控制的角度来看,即考虑通信信令,AP和STA还是主从的关系。 @SystemApi,改变Wifi-AP的开关状态。开启的AP,将使用参数定义的WifiConfiguration信息。 可以看出,手机热点对应接口全部变成了SystemApi,因此在android的高版本上,应用基本上是无法再操作热点了。 以上所述是小编给大家介绍的Android连接指定Wifi的方法实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!