【 Android11 WiFi开发 二 】WiFi连接、断开

news2024/11/26 2:02:56

前言


上篇文章介绍了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.configuredNetworks
        configs.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.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禁用和删除该网络,再断开网络的连接。

    /**
     * 忘记连接过WiFi
     * @param[config] 指定WiFi的配置
     */
    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后使能网络,保存下当前配置。

    /**
     * 连接到保存过的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 = -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)
	
    /**
     * 创建无密码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.connectionInfo
        return 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地址等功能。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

卷积基础知识总结

卷积是卷积神经网络中的核心模块&#xff0c;卷积的目的是提取输入图像的特征&#xff0c;如下图所示&#xff0c;卷积可以提取图像中的边缘特征信息。卷积也称为过滤器&#xff0c;即Filter 1 卷积的计算方法 卷积运算本质上就是在滤波器和输入数据的局部区域间做点积 注意…

MyBatis介绍与安装下载

目录 MyBatis 介绍 MyBatis 主要特点 MyBatis 下载 创建 Maven 工程 IDEA 连接数据库 导入JAR文件到项目 MyBatis 介绍 MyBatis是一种开源的Java持久化框架&#xff0c;用于将SQL数据库访问和映射任务与Java对象之间的映射分离。它提供了一种简单的方式来对数据库进行操…

消息中间件的首选之一:探索RocketMQ的优势和特性

​​​​​​​ 1、简介 RocketMQ 是一款开源的分布式消息队列系统&#xff0c;由阿里巴巴集团开发并开源。它是为了满足大规模分布式系统中的消息通信和异步解耦需求而设计的&#xff0c;具有高吞吐量、低延迟、可靠性强等特点。下面将详细介绍 RocketMQ 的架构、组件和关键特…

【网络进阶】Posix API与网络协议栈(三)

文章目录 1. 网络攻击和POSIX API与网络协议栈的关系1.1 网络攻击的基本概念和它们对协议栈的影响1.2 分布式拒绝服务&#xff08;DDoS&#xff09;攻击和网络协议栈1.3 地址解析协议&#xff08;ARP&#xff09;欺骗和POSIX API 2. 网络协议栈的理解和划分2.1 OSI七层模型2.2 …

AI 边缘计算控制器GEAC91

1 产品概览 产品概览 GEAC91 AI边缘计算控制器是一款基于 NVIDIA Jetson AGX Xavier处理 器、面向智能边缘计算应用场景的解决方案。 GEAC91控制器具有 控制器具有 GMSL2、 千兆网口CAN总线、 RS232、RS422、 USB3.0、USB2.0、SD卡等丰富的外设接口 &#xff0c;支持常见激光雷…

记录--不定高度展开收起动画 css/js 实现

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 不定高度展开收起动画 最近在做需求的时候&#xff0c;遇见了元素高度展开收起的动画需求&#xff0c;一开始是想到了使用 transition: all .3s; 来做动画效果&#xff0c;在固定高度的情况下&#xf…

霍尔闭环电流传感器在电动观光旅游车上的应用

摘要&#xff1a;本文介绍了基于霍尔闭环原理&#xff0c;即磁平衡式原理的电流传感器在电动观光旅游车上的使用方法&#xff0c;替代传统的霍尔器件&#xff0c;较好的解决了电动车行业现有霍尔传感器的基本问题&#xff0c;在稳定性上更加优越。 关键词&#xff1a;霍尔闭环…

2022 年首届“钉钉杯”大学生大数据挑战赛B题:航班数据分析与预测——国奖论文代码分享

2023年的钉钉杯挑战赛马上要来了~这里给大家分享一下去年的国奖论文思路与代码 摘要&#xff1a; 随着民航事业的迅速发展 , 飞机出行已成为未来发展的一种必然趋势&#xff0c;然而近年来&#xff0c; 航班延误现象频频发生&#xff0c;成为困扰机场和航空公司的难题。对航班…

Idea项目application.properties配置文件默认GBK,如何设置默认为UTF-8编码

简述&#xff1a;java程序在项目中一般设置都是UTF-8编码格式&#xff0c;但是项目application.properties 文件默认是GBK,需要手工修改默认编码格式 步骤&#xff1a; file->setting->editor->file encodings下&#xff0c;勾选transparent native-to-ascll conver…

AR远程协助平台运用到建筑领域能带来哪些帮助?

随着科技的不断发展&#xff0c;远程协同培训已经成为了一种越来越受欢迎的学习方式。在建筑施工领域中&#xff0c;这种学习方式同样具有很大的应用价值。本文将探讨AR远程协助平台在建筑施工中的应用。 首先&#xff0c;AR远程协助平台可以提高建筑施工的效率和质量。传统的…

Java学习之Varargs机制

概述 Varargs&#xff0c;即variable number of arguments&#xff0c;variable arguments。中文一般译为&#xff0c;可变长度参数&#xff0c;或简称可变参数&#xff0c;参数具体来说是形参。 自JDK5引入&#xff0c;借助这一机制&#xff0c;可以定义能和多个实参相匹配的…

基于Java+SpringBoot+Vue的流浪动物救助平台设计与实现

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…

【前端|CSS系列第2篇】CSS零基础入门之常用样式属性

欢迎来到CSS零基础入门系列的第二篇博客&#xff01;作为前端开发的关键技术之一&#xff0c;CSS&#xff08;层叠样式表&#xff09;能够为网页添加各种样式和布局效果。对于前端零基础的小白来说&#xff0c;了解和掌握CSS的常用样式属性是入门的关键。本篇博客将带你深入了解…

基本的组合门电路、以及二极管、三极管(详细讲解)

基本门电路、二极管、三极管 1.基本的组合门电路1.1 与门&#xff08;AND Gate&#xff09;&#xff1a;2.2 或门&#xff08;OR Gate&#xff09;&#xff1a;1.3 非门&#xff08;NOT Gate&#xff09;&#xff1a;1.4 异或门&#xff08;XOR Gate&#xff09;&#xff1a; 2…

chatgpt赋能python:Python面向对象和面向过程编程

Python面向对象和面向过程编程 Python是一种高级编程语言&#xff0c;可以使用不同的编程风格进行开发。本篇文章将讨论Python面向对象和面向过程编程风格的概念、差异和优缺点。 什么是面向对象编程&#xff1f; 面向对象编程是一种编程范式&#xff0c;它将现实世界的概念…

TP6在composer包里写控制器

前提&#xff1a;首先要了解下如何自建composer包。 1.先建一个空包&#xff0c;加一个文件&#xff1a;composer.json {"name": "test/ctrs","type": "library","license": "MIT","autoload": {&quo…

Python一行命令搭建HTTP服务器并外网访问+-+内网穿透

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章&#xff1a;【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…

PS扣签名

打开Photoshop CS6&#xff0c;依次点击“文件”-“打开”&#xff0c;把签名照导入进来。 在“选择”菜单下点击“色彩范围”。 此时鼠标形状变成了一支笔&#xff0c;点击签名上黑色的地方&#xff0c;适当调整颜色容差&#xff0c;点击“确定”完成选择。 按住CtrlJ组…

基于Java园区停车管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

【SWAT水文模型】率定参数选择及校准技巧

SWAT模型率定参数选择及校准技巧 水量平衡与径流&#xff08;Water Balance And Stream Flow&#xff09;1 基本水量平衡和总径流校准&#xff08;Basic Water Balance & Total Flow Calibration&#xff09;1.1 校准地表径流&#xff1a;1.2 校准地下径流&#xff1a; 2 流…