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

news2024/9/20 22:34:43

前言


最近在Android11上开发了WiFi相关功能,涉及到WiFi列表的获取、连接有密码的WiFi、连接已保存的WiFi、忘记连接的WiFi、添加其他WiFi。涉及到的知识点较多作以分篇记录,本篇将介绍WiFi列表的获取与展示。


说明


下面梳理下WiFi列表获取流程:

  • 判断WiFi开关是否打开(假设打开-Y)
  • 打开情况显示WiFi列表布局
  • 判断当前是否有扫描任务(假设没有-N)
  • 开启扫描动画、延时20S后开始扫描可用WiFi(时间根据需求定义)、获取当前连接的WiFi
  • 接收到扫描结果广播
  • 停止扫描动画、对获取WiFi列表进行过滤
  • 通知WiFi列表刷新
  • 不延时扫描可用WiFi、获取当前连接的WiFi

在这里插入图片描述


实现

上述介绍了WiFi扫描获取流程,下面将介绍相关的API和功能实现。

Android中提供了WifiManager类用来管理WiFi

1、WifiManager对象的获取:


	private val wifiManager:WifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager

2、判断WiFi是否使能

   /**
    * WiFi开关是否使能
    */
    fun isWiFiEnabled(): Boolean {
       return wifiManager.isWifiEnabled
    }

   /**
    * 设置WiFi开关是否使能
    */
    fun setWiFiEnable(enable: Boolean) {
       wifiManager.isWifiEnabled = enable
    }


3、扫描WiFi

调用WifiManagerstartScan()方法,即可开启对WiFi扫描。此方法已标记为遗弃,但是目前版本可以使用。

 	/**
	 * 开启扫描WiFi事件
	 */
	fun startScan(): Boolean {
	     return wifiManager.startScan()
	}

4、扫描WiFi结果广播

Android WiFi扫描结果提供了对外广播,监听此广播、接收到以后进行业务操作。

 
 	WifiManager:
 
	public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS";
  

5、获取扫描结果

注册上述广播,有回调后表示扫描结束,通过wifiManager.getScanResults获取扫描到的WiFi列表。

  
  	val wifiList = wifiManager.scanResults as ArrayList<ScanResult>
   

通过上述方法获取的WiFi列表需要进行过滤才能进行展示,过滤条件有以下几点:

  • 过滤同一WiFi:扫描结果中同一个WiFi可能会返回多次,集合中存在多个。
  • 过滤名字为空的WiFi:判断当前WiFi名是否为空,为空不添加新的集合中。
  • 过滤当前连接的WiFi:列表中不显示当前连接的WiFi
  • 过滤设备自发的热点:列表中不显示设备自发热点。
  • 按信号强弱排列:根据WiFi信号强度从高到低排列。

继续了解WifiManager中提供的相关方法。


6、获取当前连接的WiFi信息

通过wifiManager.getConnectionInfo() 可以获取当前连接的WiFi信息。

    /**
     * 获取当前连接的WiFi名称
     */
    fun getSSID(): String? {
        val wifiInfo = wifiManager.connectionInfo
        if (wifiInfo != null) {
            val s = wifiInfo.ssid
            if (s.length > 2 && s.toCharArray()[0] == '"' && s.toCharArray()[s.length - 1] == '"') {
                return s.substring(1, s.length - 1)
            }
        }
        return null
    }

7、WiFi信号强度排序

上面提到了WiFi扫描结果的获取,信号强度level通过扫描结果对象ScanResult中获取。

	
	/**
     * 通道频率
     */
    public static final int CHANNEL_WIDTH_160MHZ = 3;
    public static final int CHANNEL_WIDTH_20MHZ = 0;
    public static final int CHANNEL_WIDTH_40MHZ = 1;
    public static final int CHANNEL_WIDTH_80MHZ = 2;
    public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4;
 
 	/**
     * WiFi频段
     */
    public static final int UNSPECIFIED = -1;
    public static final int WIFI_BAND_24_GHZ = 1;
    public static final int WIFI_BAND_5_GHZ = 2;
    public static final int WIFI_BAND_60_GHZ = 16;
    public static final int WIFI_BAND_6_GHZ = 8;
   
   	//访问点的Mac地址	
 	public String BSSID;
 	//WiFi名称
    public String SSID;
    //描述了身份验证、密钥管理和访问点支持的加密方案
    public String capabilities;
  
    //带宽
    public int channelWidth;
    //主20 MHz的频率(MHz)的渠道客户交流访问点
    public int frequency;
    //信号强度,也称RSSI
    public int level;
    

8、WiFi状态获取

提供了广播WIFI_STATE_CHANGED_ACTION来监听WiFi状态的改变,通过通wifiManager.getWifiState() 来获取当前WiFi状态。


	WifiManager:
		
    public static final String WIFI_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_STATE_CHANGED";
    
	public static final String EXTRA_WIFI_STATE = "wifi_state";

  	/**
     * 获取WiFi状态
     */
    fun getState(): Int {
        return wifiManager.wifiState
    }

  

WiFi开关、列表UIWiFi相关信息的显示与隐藏的操作,可以在WiFi状态切换中来修改。

在WiFi列表获取和WiFi状态


    /**
     * 网络相关广播
     */
    class WiFiBroadcastReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            if(App.DEBUG) Log.i(TAG,"[onReceive] action = ${intent.action}")
            when (intent.action) {
                WifiManager.WIFI_STATE_CHANGED_ACTION -> {
                    if(App.DEBUG) Log.i(TAG,"WIFI_STATE_CHANGED_ACTION")
                    val wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED)
                 	stateChange(wifiState)
                }
                WifiManager.SCAN_RESULTS_AVAILABLE_ACTION -> {
                    if(App.DEBUG) Log.i(TAG,"SCAN_RESULTS_AVAILABLE_ACTION")
                    //停止扫描任务
                    cancelScanTask()
                    //停止扫描动画
                    stopAnimation()
                    //获取wifi列表并过滤返回
                    val wifiList = WiFiUtils.scanWiFiListResult()
                    //通知列表刷新
                    notifyWiFiList(wifiList)
                }
            }
        }
    }
		
	fun stateChange(state:Int){
		when(state){
		//WiFi正在关闭中...
		WifiManager.WIFI_STATE_DISABLING ->{
		}
			
		//WiFi已经关闭
  		WifiManager.WIFI_STATE_DISABLED ->{
  		}
  		
		//WiFi正在打开中...
 		WifiManager.WIFI_STATE_ENABLING ->{
 		}
 		
		//WiFi已经打开
  		WifiManager.WIFI_STATE_ENABLED ->{
  		} 
	}
    

结尾

上述介绍了Android11WiFi列表的获取流程与对应的API方法,下篇文章介绍对WiFi的相关操作,连接断开连接、获取WiFi信息等。

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

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

相关文章

白嫖的text2video模型ZeroScope_v2

ZeroScope是一种基于ModelScope的视频生成模型&#xff0c;可以通过文本生成16:9的高质量视频。 Zeroscape 是一种基于 Transformer 架构的语言生成模型&#xff0c;其中包括了多种不同的变体和版本。其中&#xff0c;zeroscape_v2 是一种较新的模型&#xff0c;相较于之前的版…

浅谈电气火灾监控系统在高层建筑的应用

摘要&#xff1a;通过介绍上海某高层建筑电气火灾监控系统设计情况&#xff0c;对电气火灾监控系统工作特点和具体设计内容进行说明&#xff0c;同时提出一些设 计过程中需注意的事项&#xff0c;供业内人士借鉴&#xff0c;以期增进对电气火灾监控系统设计的重视&#xff0c;…

【vim】Linux种的vim

:q quit (close window) :w save (“write”) :wq save and quit :e {name of file} open file for editing :ls show open buffers :help {topic} open help :help :w opens help for the :w command:help w opens help for the w movement <ESC>进入vim模式 &l…

Python如何调用C库(Windows Linux)

软硬件环境 ubuntu 18.04 64bitwindows 10 64bitPython 3.8GCC 4.9visual studio 前言 在做 python 开发中&#xff0c;经常会碰到&#xff0c;需要通过调用 C 的一个动态链接库来获取相应的值。本文详细讲解了 Windows 和 Linux 2个平台上的不同实现。 linux版的动态库 写个简…

搬运/移植Anaconda配置的项目注意事项

从旧电脑上将项目搬运至新电脑时&#xff0c;搬运项目的时候&#xff0c;将原项目的环境也拷贝过去了&#xff0c;发现出现了问题&#xff0c;使用pip进行安装库的时候&#xff0c;怎么都用不了。错误内容为&#xff1a; Fatal error in launcher: Unable to create process us…

【算法与数据结构】541、LeetCode反转字符串 II

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题自己写了一个swap函数&#xff0c;用来反转字符串&#xff0c;也可以用库函数reverse。然后是用in…

一文学会使用键盘控制moveit2机械臂模型

文章目录 前言一、官方样例实现软件版本bug修复运行测试 二、gp110机械臂控制文件添加文件修改编译工程运行测试 总结 前言 在之前文章的基础上相信大家已经学会了如何搭建一个机械臂模型&#xff0c;那么我们如何对其进行控制呢&#xff0c;上网检索了一下没找到能清晰指导实…

3.2 Java标识符

3.2 Java标识符 关键字&#xff0c;Java中一些预先设定好的单词被称为关键字常用关键字如下图所示 图中的关键字都是Java预先设定好的&#xff0c;在平时应用中不能用这些关键词作为名字来使用。因为Java已经赋予这些关键字一些意义不能直接使用&#xff0c;这些关键词是Java中…

真实遇到Redis双写一致性问题

今天工作中接到一个bug&#xff0c;产品那边描述&#xff0c; 在后台添加一个供应商后前台无法展示。 是个例还是全部&#xff1f;他说应该是个例。 开始分析。。。。。。。 首先数据库查询可以查出新添加的这个供应商的&#xff0c;说明添加成功的&#xff0c;唯一的问题肯定…

Baltamatica 北太天元 —— 基于模拟退火算法的旅行商问题

文章目录 北太天元&#xff08;Baltamatica&#xff09;简介Baltamatica 复现基于Matlab的旅行商问题问题描述模拟退火算法Metropolis准则算法流程图&#xff1a; Demo1&#xff1a;只考虑累计距离&#xff0c;通过模拟退火算法求解最短路径matlab代码&#xff1a;Baltam代码&a…

Go 语言基础语法:Hello World 实例(涉及定义变量;fmt 包、Print、Println、Printf)

Hello world实例 package mainimport "fmt"func main() {fmt.Println("Hello, World!") } 编译 运行 go run hello.go Hello, World! go run 做了编译和执行两动作&#xff0c;编译会生成 hello 文件&#xff0c;执行完成后此文件会被删除。 web展示 …

STM32外设系列—L298N

文章目录 一、L298N简介二、L298N电路图三、L298N使用方法四、L298N驱动电机实例4.1 麦克纳姆轮简介4.2 定时器PWM配置4.3 智能车行驶控制 五、拓展应用 一、L298N简介 L298N是SGS公司生产的一款通用的电机驱动模块。其内部包含4路逻辑驱动电路&#xff0c;有两个H桥的高电压大…

java并发编程 3:synchronized与锁(重点)

目录 共享问题synchronized锁及使用synchronized代码块synchronized 修饰成员方法synchronized 修饰静态方法 变量的线程安全分析成员变量和静态变量是否线程安全局部变量是否线程安全常见线程安全类 synchronized底层原理Java对象头Monitor管程字节码看原理 锁状态及转换四种锁…

vscode 快速修复(quick fix) 快捷键(Ctrl + .)被占用问题解决方法

vscode 快速修复(quick fix) 快捷键(Ctrl .)被占用 微软拼音的中/英文标点切换的快捷键为Ctrl .&#xff0c;与 vscode 快速修复(quick fix)快捷键冲突。修复方法如下&#xff1a; 切换到微软拼音&#xff0c;在输入法中或英字上&#xff0c;点击右键。 再点设置 - 按键。 …

MTK平台WLAN的Roaming机制和案例log解析

一 、WLAN漫游简介 [百度百科]:当网络环境存在多个相同SSID的AP,且它们的微单元互相有一定范围的重合时,无线用户可以在整个WLAN覆盖区内移动,无线网卡能够自动发现附近信号强度最大的AP,并通过这个AP收发数据,保持不间断的网络连接,这就称为无线漫游。 简单来说:WLA…

Flink中时间和窗口

文章目录 一、时间定义二、水位线(Watermark)1、概念2、水位线特征3、生成水位线3.1 水位线生成策略&#xff08;Watermark Strategies&#xff09;3.2 Flink 内置水位线生成器3.3 自定义水位线策略 4、水位线的传递 三、窗口(Window)1、概念2、窗口分类2.1 驱动类型分类2.2 窗…

chatgpt赋能python:Python输入之后的运行过程

Python输入之后的运行过程 在Python中&#xff0c;输入是必不可少的一部分&#xff0c;它使我们能够更加交互和动态地使用这门语言。在本篇文章中&#xff0c;我们将介绍Python输入的运行过程&#xff0c;包括如何读取和处理输入以及输入与程序运行的交互方式。 什么是Python…

ZLMediaKit 的安装及使用介绍

ZLMediaKit 介绍 ZLMediaKit是一个基于C开发的开源流媒体服务器。它提供了高性能的音视频处理能力&#xff0c;支持常见的流媒体协议&#xff0c;如RTSP、RTMP、HLS和HTTP-FLV&#xff0c;并且具有低延迟和高并发处理能力。 开源地址&#xff1a;https://github.com/xia-chu/…

抖音seo账号矩阵系统源码代开发组件

一.开发矩阵系统的项目背景&#xff1a; 目录 一.开发矩阵系统的项目背景&#xff1a; 二.短视频矩阵系统SaaS模板组件通常包含以下几个方面的内容&#xff1a; 三.抖音SEO账号矩阵系统源码的技术搭建过程可以分为几个步骤&#xff1a; 1.确定系统的需求和目标&#xff0c…

DFS深度优先搜索

目录 一、DFS的概念DFS的定义DFS的搜索方式DFS采用的数据结构DFS的特点 二、DFS的实战应用1.排列数字2.n-皇后问题 一、DFS的概念 DFS的定义 DFS&#xff08;Depth-First Search&#xff09;深度优先搜索&#xff0c;是一种常用的图遍历算法&#xff0c;用于在图或树数据结构…