Android App内WiFi扫描及连接

扫描筛选固定前缀的AP热点显示,点击列表item连接WiFi

一、功能梳理

1.权限检查

2.WiFi列表扫描

3.WiFi扫描结果筛选显示

4.连接特定wifi

二、WiFi扫描与连接需要申请的权限










三、代码实现

1、获取WifiManager

val manager:WifiManager = context.applicationContext     .getSystemService(Context.WIFI_SERVICE) as WifiManager

2、打开wifi开关

Android 10 不支持代码打开WiFi开关,需要用户跳转系统界面自行打开开关

manager?.let {
       
    if (!manager!!.isWifiEnabled) {
          
    if (Build.VERSION.SDK_INT < 29) {
               
        manager!!.isWifiEnabled = true        
    } else{
   
        //Android 10 不支持代码打开WiFi开关,需要用户跳转系统界面自行打开开关
    } 
}
}

3、获取已连接Wifi信息

val wifiMgr = context.applicationContext        .getSystemService(Context.WIFI_SERVICE) as WifiManager
val info = wifiMgr.connectionInfo

4、扫描

startScan API 未来将弃用,暂未找到替代方法API 29目前可用 。

The ability for apps to trigger scan requests will be removed in a future release.

manager!!.startScan()

扫描结果

可以通过监听广播监听扫描是否完成,“ { SCAN_RESULTS_AVAILABLE_ACTION}”表示扫描结束,可读取扫描结果(扫描结果一次返回全部结果,所以如不注册广播,直接监听扫描结果列表,列表不为空,可认为一次扫描结束)

manager!!.scanResults

5、扫描结果过滤、处理

若wifi环境复杂,会扫描出很多SSID相同,BSSID不同的结果,可以过滤SSID相同的wifi,只显示信号最好的相同SSID的wifi结果

也可以根据SSID显示特定wifi结果

/** * 过滤重复ssid的wifi,只显示信号最强的 */
private fun getWifiList(list: MutableList<ScanResult>): MutableList<ScanResult>{
       
val result: MutableList<ScanResult> = mutableListOf()
for (i in 0 until list.size) {
   
	val position: Int = getItemPosition(result, list[i])
	if (position != -1) {
    
		if (list[position].level < list[i].level) {
   
			result.removeAt(position)       
		 	result.add(position, list[i]) 
		}
	}

你可能感兴趣的:(功能记录,android)