Android App如何获取WiFi网络列表?替代已弃用API及搜索特定网络
替代已弃用API获取WiFi网络列表的方案
从Android 10(API 29)开始,WiFiManager.startScan()被正式弃用,官方推荐使用WifiManager.registerScanResultsCallback()来获取WiFi扫描结果,以下是具体实现方案,以及如何搜索特定前缀的网络。
一、获取WiFi网络列表的替代实现
1. 声明必要权限
在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- Android 12+ 必需 -->
注意:位置权限属于危险权限,需在代码中动态申请,且必须开启系统位置服务才能获取扫描结果。
2. 注册扫描结果回调
通过registerScanResultsCallback监听系统WiFi扫描结果,无需手动调用startScan():
val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager // 创建扫描回调 val scanCallback = object : WifiManager.ScanResultsCallback() { override fun onScanResultsAvailable() { // 获取最新扫描结果 val scanResults = wifiManager.scanResults // 遍历处理网络信息 scanResults.forEach { result -> val ssid = result.SSID val bssid = result.BSSID val signalStrength = result.level // 此处可将数据绑定到UI列表展示 } } } // 注册回调,使用主线程执行结果回调 wifiManager.registerScanResultsCallback(applicationContext.mainExecutor, scanCallback)
3. 销毁时注销回调
避免内存泄漏,在页面销毁或不再需要监听时注销:
override fun onDestroy() { super.onDestroy() wifiManager.unregisterScanResultsCallback(scanCallback) }
二、搜索特定前缀的WiFi网络
获取到ScanResults列表后,直接通过字符串过滤即可:
val targetPrefix = "ABCD" val filteredNetworks = scanResults.filter { result -> // 注意处理SSID为空的隐藏网络 result.SSID.isNotEmpty() && result.SSID.startsWith(targetPrefix) } // 处理过滤后的目标网络,比如展示到UI或发起连接
关键注意事项
- 位置服务依赖:Android 10及以上,必须授予位置权限并开启系统位置服务,否则无法获取扫描结果。
- 后台限制:Android 12及以上,后台应用获取WiFi扫描结果会被严格限制,仅前台应用能正常获取。
- 隐藏网络:部分隐藏网络的SSID为空字符串,过滤时需做非空判断。
内容的提问来源于stack exchange,提问作者Microkid
相关产品推荐
相关产品推荐

