前言

上篇文章介绍了WiFi列表的获取与展示和WiFi状态改变的广播监听,本篇将介绍介绍对WiFi的操作,连接、忘记,查看已连接的WiFi信息等。

相关文章

1、【 Android11 WiFi开发 一 】WiFi列表获取与展示

说明

老规矩,先把WiFi连接和断开的流程梳理下。

①、点击WiFi条目,判断WiFi是否保存,如果未保存则进行Step②,否则进行Step③
②、判断WiFi是否有密码,如果有密码则弹出密码输入框,进行Step⑥,若无密码,进行Step⑦
③、WiFi是已保存状态,则弹出"忘记"、“连接” WiFi弹窗,点击"忘记"进行Step④、"连接"进行Step⑤
④、调用forgetWifi、刷新列表
⑤、当前是否有已连接的WiFi或正在连接的WiFi,有的话忘记此WiFi,然后连接到指定的WiFi
⑥、输入密码,校验密码是否正确,如果正确,连接成功。反之,则提示密码错误
⑦、连接无密码WiFi,创建配置直接连接

实现

上述介绍了WiFi的连接和忘记流程,下面将介绍相关的API和功能实现,当然WifiManager还是核心类,WiFi配置类WifiConfiguration

1、判断WiFi是否保存过

获取连接过的WiFi配置集合,判断SSID和当前的是否一致,如果一致,说明WiFi被保存过。

     /*** 判断WiFi是否保存过*/fun isWiFiSaved(ssid:String):WifiConfiguration?{val configs = wifiManager.configuredNetworksconfigs.forEach { if(it.SSID.equals("\"" + ssid + "\"")){ return it } }return null}

2、忘记WiFi

当前WiFi被保存过,可以执行"忘记"WiFi,首先要去获取此WiFi的配置,这个配置是在连接WiFi时候创建的。

    /*** 获取当前SSID的WiFi配置* @param[ssid] 字符串或一串16进制的数字*/fun getWiFiConfig(ssid: String?): WifiConfiguration? {val configs = wifiManager.configuredNetworksif(App.DEBUG) Log.i(TAG,"configs size = ${configs.size}")if (configs != null && configs.size > 0 ) {for( config in configs){if(App.DEBUG) Log.i(TAG,"config = $config")val configSSID = config.SSID.replace("\"", "")if (ssid == configSSID) return config}}return null}

忘记WiFi,首先要获取到该网络的networkId,根据networkId禁用和删除该网络,再断开网络的连接。

    /*** 忘记连接过WiFi* @param[config] 指定WiFi的配置*/fun forgetWiFi(config: WifiConfiguration?):Boolean {var success = falseif(config?.isPasspoint == true){wifiManager.removePasspointConfiguration(config.FQDN)success = true}else{config?.networkId?.let {wifiManager.disableNetwork(it)wifiManager.removeNetwork(it)wifiManager.disconnect()success = true}}return success}

3、连接已保存的WiFi

通过SSID获取WiFi配置,获取到networkId后使能网络,保存下当前配置。

    /*** 连接到保存过的WiFi* @param[ssid] 字符串或一串16进制的数字*/fun connectSavedWiFi(ssid:String){if(App.DEBUG) Log.i(TAG,"ssid = $ssid")val config = getWiFiConfig(ssid)config?.networkId?.let { enableNetwork(it,true) }wifiManager.saveConfiguration()}/*** 使能网络*/fun enableNetwork(networkId: Int, b: Boolean): Boolean {return wifiManager.enableNetwork(networkId, b)}

介绍完对已保存的WiFi的操作,下面将对新的WiFi连接做介绍。

4、判断WiFi是否有密码

enum class WiFiSecurity(security :String){NONE("Nothing"),WEP("WEP"),PSK("WPA/WPA2 PSK"),EAP("802.1x EAP"),OWE("OWE"),SAE("SAE");fun getSecurity(result: ScanResult):WiFiSecurity {if (result.capabilities.contains("WEP")) {return WEP} else if (result.capabilities.contains("PSK")) {return PSK} else if (result.capabilities.contains("EAP")) {return EAP} else if (result.capabilities.contains("OWE")) {return OWE} else if (result.capabilities.contains("SAE")) {return SAE}return NONE}}

5、连接有密码的WiFi

    val networkId = WiFiUtils.createWiFiConfig(wifiList,result.SSID,password)WiFiUtils.enableNetwork(networkId,true)/*** 创建WiFi配置*/fun createWiFiConfig(wifiList:ArrayList<ScanResult>,ssid:String,pwd:String):Int{var networkId = -1wifiList.forEach {if(it.SSID.equals(ssid)){val config = WifiConfiguration().apply {SSID = "\"" + it.SSID + "\""preSharedKey = "\"" + pwd + "\""hiddenSSID = falsestatus = WifiConfiguration.Status.ENABLED}networkId = wifiManager.addNetwork(config)}}return networkId}

5、连接无密码的WiFi

     val networkId =  WiFiUtils.createNoPwConfig(result.SSID),true)WiFiUtils.enableNetwork(networkId,true)/*** 创建无密码WiFi配置*/fun createNoPwConfig(ssid:String):Int{val config = WifiConfiguration().apply {allowedAuthAlgorithms.clear()allowedGroupCiphers.clear()allowedKeyManagement.clear()allowedPairwiseCiphers.clear()allowedProtocols.clear()SSID = "\"" + ssid + "\""allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE)}return wifiManager.addNetwork(config)}

连接WiFi,系统会返回连接的结果,是否连接成功、密码是否正确等,Android中也是提供了对应的广播WifiManager.SUPPLICANT_STATE_CHANGED_ACTION

/*** 获取WiFi连接过程的状态*/fun getState():SupplicantState{val info = wifiManager.connectionInforeturn info.supplicantState}/*** WiFi连接过程处理* @param[state] 请求状态*/private fun connectProcess(intent:Intent,state: SupplicantState) {when(state){SupplicantState.SCANNING ->{ if(App.DEBUG) Log.i(TAG,"WiFi正在扫描") }SupplicantState.ASSOCIATING -> { if(App.DEBUG) Log.i(TAG,"正在关联AP") }SupplicantState.AUTHENTICATING -> { if(App.DEBUG) Log.i(TAG,"正在验证") }SupplicantState.ASSOCIATED -> { if(App.DEBUG) Log.i(TAG,"关联AP成功") }SupplicantState.COMPLETED ->{if(App.DEBUG) Log.i(TAG,"连接成功")}SupplicantState.DORMANT,SupplicantState.DISCONNECTED ->{if(App.DEBUG) Log.i(TAG,"连接不成功")}else ->{ if(App.DEBUG) Log.i(TAG,"其他情况") }}//获取错误结果val connectResult = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR,123)if(App.DEBUG){ Log.i(TAG,"WiFi Link Error: $connectResult") }if(connectResult == WifiManager.ERROR_AUTHENTICATING){if(App.DEBUG) Log.i(TAG,"密码错误")ctx.toast(R.string.pw_incorrect_retry)}}

结尾

这是Android11上WiFi开发记录的第二篇文章,连接已保存的WiFi、忘记已保存的WiFi、连接有密码和无密码的WiFi。后续篇幅将介绍WiFi信息的获取、WiFi设置静态IP地址等功能。

【 Android11 WiFi开发 二 】WiFi连接、断开相关推荐

  1. WIFI性能测试二 --- wifi的ANI功能

    WIFI性能测试二 --- wifi的ANI功能 最近解决公司wifi产品经常断线和连接不稳定时,查阅了一些资料,现总结记录如下: 1. wifi的ANI功能 参考链接: http://gregsow ...

  2. c语言 wifi 开发,Android WIFI Direct开发教程

    创建一个 WIFI Direct 应用程序,包括发现连接点.请求连接.建立连接.发送数据,以及建立对该应用程序广播的 Intent 进行接收的 BroadcastReceiver,需要经过以下步骤. ...

  3. W801/W800-wifi-socket开发(二)-UDP蓝牙控制wifi连接

    这是目录 一.项目概述 二.项目设计 三.程序设计 3.1.主任务设计 3.2.蓝牙数据解析 3.3.wifi连接 四.测试 4.1.连接测试 4.2. 重连测试 4.3 .停止测试 4.4 .功耗测 ...

  4. Android WiFi开发教程(二)——WiFi的搜索和连接

    在上一篇中我们介绍了WiFi热点的创建和关闭,如果你还没阅读过,建议先阅读上一篇文章Android WiFi开发教程(一)--WiFi热点的创建与关闭. 本章节主要继续介绍WiFi的搜索和连接. Wi ...

  5. WiFi开发|ESP8266模组AT指令开发二

    ESP8266模组AT指令开发二 1. 基于STM32的AT指令开发 ESP8266可以使用官方提供的SDK来进行开发,也可以直接利用官方提供的固件直接使用AT指令配置模块使用.在ESP8266模组A ...

  6. 【Android开发】wifi开关与wifi连接(密码连接)

    过放荡不羁的生活,容易得像顺水推舟,但是要结识良朋益友,却难如登天.-- 巴尔扎克 本文demo来自网络,找了好久找到的,后面自己做了些许修改,这里对源码解析,愧于忘记哪里出来了,感谢作者! 接下来就 ...

  7. android开发打开wifi密码,【Android开发】wifi开关与wifi连接(密码连接)

    过放荡不羁的生活,容易得像顺水推舟,但是要结识良朋益友,却难如登天.-- 巴尔扎克 本文demo来自网络,找了好久找到的,后面自己做了些许修改,这里对源码解析,愧于忘记哪里出来了,感谢作者! 接下来就 ...

  8. Android WiFi开发 (二)分享Wifi热点

    Android WiFi开发 (二)Wifi热点 标签: wi-fiandroid热点安全 2016-03-07 13:08  11415人阅读  评论(29)  收藏  举报   分类: Andro ...

  9. android 获取wifi的加密类型,Android WIFI开发:获取wifi列表,连接指定wifi,获取wifi加密方式,监听wifi网络变化等...

    下面是 Android 开发中 WiFi 的常用配置,如:获取当前 WiFi ,扫描 WiFi 获取列表,连接指定 WiFi ,监听网络变化等等. 下面是效果图: GitHub 下载地址:https: ...

最新文章

  1. 《Adobe AIR权威指南》——《Flex 3权威指南》作者新作
  2. Effective Python 小笔记之 zip 函数
  3. 详解python2 和 python3的区别
  4. Java HashMap遍历的两种方式
  5. ASP.NET Core 中文文档 第二章 指南(4.5)使用 SQL Server LocalDB
  6. HashMap和Hashtable的区别总结
  7. webService 使用CXF 实现简单的helloworld
  8. mysql期末考试选择题
  9. python hbase_Python操作Hbase
  10. 这七种回归分析技术,学了不后悔~
  11. python如何批量下载邮箱全部附件_Python编写执行测试用例及定时自动发送最新测试报告邮件...
  12. 中国科学院计算机研究生调剂,计算机网络信息中心2019年硕士研究生接收调剂信息公告...
  13. 更复杂的缓存穿透怎么解决
  14. 数据科学 | Numpy入门教程
  15. 西瓜数据集的各种版本,比如说2.0,3.0,4.0都在这
  16. 安全高效的中小型网络
  17. 如何批量调整论文中公式大小--mathtype
  18. 【数据分析】互联网金融客户画像
  19. linux系统运维面试2000多题
  20. linux字体怪异_Linux默认安装的字体模糊难看

热门文章

  1. miniblink载入html,miniblink使用小结
  2. JavaScript 赋值运算符 、运算符 优先级
  3. Codeforces 90B-African Crossword
  4. 幼儿园园本课程开发的实践与思考
  5. leaflet (1)在R语言中导入高德地图
  6. PHP颜色十六进制转化为RGB
  7. 阿里云mysql容量_阿里云RDS的mysql数据库占用空间超过90%的处理
  8. python数组与矩阵运算
  9. hutool 解读 (一)—— 类型转换
  10. Visual Studio 2010简体中文版问世