扫描筛选固定前缀的AP热点显示,点击列表item连接WiFi
一、功能梳理
1.权限检查
2.WiFi列表扫描
3.WiFi扫描结果筛选显示
4.连接特定wifi
二、WiFi扫描与连接需要申请的权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" />
三、代码实现
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])
}
}