【 Android11 WiFi开发 二 】WiFi连接、断开
前言
上篇文章介绍了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被保存过。
fun isWiFiSaved(ssid:String):WifiConfiguration?{ val configs = wifiManager.configuredNetworks
configs.forEach { if(it.SSID.equals("\"" + ssid + "\"")){ return it } } return null }
2、忘记WiFi
当前WiFi被保存过,可以执行"忘记"WiFi,首先要去获取此WiFi的配置,这个配置是在连接WiFi时候创建的。
fun getWiFiConfig(ssid: String?): WifiConfiguration? { val configs = wifiManager.configuredNetworks if(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禁用和删除该网络,再断开网络的连接。
fun forgetWiFi(config: WifiConfiguration?):Boolean { var success = false if(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后使能网络,保存下当前配置。
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) fun createWiFiConfig(wifiList:ArrayList<ScanResult>,ssid:String,pwd:String):Int{ var networkId = -1 wifiList.forEach { if(it.SSID.equals(ssid)){ val config = WifiConfiguration().apply { SSID = "\"" + it.SSID + "\"" preSharedKey = "\"" + pwd + "\"" hiddenSSID = false status = WifiConfiguration.Status.ENABLED } networkId = wifiManager.addNetwork(config) } } return networkId }
5、连接无密码的WiFi
val networkId = WiFiUtils.createNoPwConfig(result.SSID),true) WiFiUtils.enableNetwork(networkId,true) 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
fun getState():SupplicantState{ val info = wifiManager.connectionInfo return info.supplicantState } 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地址等功能。