安卓 Wi-Fi 开发的核心在于精准控制连接、高效管理状态、保障安全传输,同时兼顾系统兼容性与用户体验。 开发者需深入理解 Android Wi-Fi API 的能力边界与限制,结合实际场景设计稳定可靠的网络接入逻辑,以下从四大关键维度展开专业实践指南。
基础能力:精准控制 Wi-Fi 开关与扫描
Android 10 及以上版本大幅收紧 Wi-Fi 权限,开发者必须明确区分前台与后台操作权限。
-
开启/关闭 Wi-Fi
- Android 10+:仅系统应用或具有
CHANGE_WIFI_STATE权限的系统签名应用可直接开关;普通应用需跳转系统设置页引导用户操作。 - 推荐方案:使用
Intent(Settings.ACTION_WIFI_SETTINGS)引导用户手动开启,避免被系统拦截。
- Android 10+:仅系统应用或具有
-
扫描附近 Wi-Fi 热点
- 前台服务调用
WifiManager.getScanResults(),需满足:- 拥有
ACCESS_FINE_LOCATION权限(Android 9+ 强制要求); - 用户已授权位置权限;
- 设备 Wi-Fi 处于开启状态。
- 拥有
- 每分钟最多触发 4 次扫描(Android 9+),超频将被系统静默忽略。
- 前台服务调用
连接管理:稳定接入目标网络
Wi-Fi 连接失败率高是开发常见痛点,核心在于正确处理配置生命周期与异常重试机制。
-
添加网络配置(WPA/WPA2)
WifiConfiguration config = new WifiConfiguration(); config.SSID = "\"YourSSID\""; // 必须含双引号 config.preSharedKey = "\"yourPassword\""; config.hiddenSSID = false; config.status = WifiConfiguration.Status.ENABLED; int networkId = wifiManager.addNetwork(config); wifiManager.enableNetwork(networkId, true);
-
关键注意事项
- Android 10+ 不再支持直接连接隐藏 SSID 网络,需用户手动配置或引导用户在系统设置中连接。
- Android 11+ 限制后台应用连接 Wi-Fi:仅当应用处于前台或拥有
FOREGROUND_SERVICE权限时可调用enableNetwork。 - 连接失败后必须移除旧配置再重试,否则易因
BSSID冲突导致连接卡死。
-
监听连接状态
- 注册
BroadcastReceiver监听:WifiManager.NETWORK_STATE_CHANGED_ACTION(获取NetworkInfo)WifiManager.RSSI_CHANGED_ACTION(信号强度变化)
- 避免使用
CONNECTIVITY_CHANGE(Android 7+ 已废弃,且无法区分 Wi-Fi 与移动数据)。
- 注册
安全与性能优化
安全是 Wi-Fi 开发的底线,性能优化则直接决定用户留存率。
-
安全防护三原则
- 禁止明文传输密码:连接前对密码进行加密(如 AES),避免硬编码在代码中。
- 校验证书链:企业级 WPA-Enterprise 连接时,必须验证 CA 证书,防止中间人攻击。
- 使用 Wi-Fi RTT 定位需用户授权:Android 11+ 要求
ACCESS_FINE_LOCATION+ACCESS_BACKGROUND_LOCATION。
-
性能优化四策略
- ① 智能重连:断连后延迟 3~5 秒再重试,避免高频扫描耗电;
- ② 信号阈值决策:RSSI < -85dBm 时主动切换至 5GHz 或移动网络;
- ③ 批量配置:连接多个网络时,先
addNetwork所有配置,再统一enableNetwork; - ④ 后台任务解耦:使用
WorkManager处理 Wi-Fi 诊断任务,避免前台服务被杀。
兼容性与版本适配
Android 版本碎片化导致 Wi-Fi 行为差异显著,需建立分层适配策略。
| Android 版本 | 关键变更 | 开发应对方案 |
|---|---|---|
| 10 (Q) | 隐藏 SSID 连接受限;后台连接禁止 | 使用 WifiConfiguration 的 FQDN 字段替代 SSID;后台任务转用 WifiManager.startScan() + 通知栏引导 |
| 11 (R) | CHANGE_WIFI_STATE 权限失效;getScanResults 需前台服务 |
改用 WifiManager.registerWifiListener();扫描前检查 isLocationEnabled() |
| 12 (S) | 新增 WifiManager.createWifiScanner() API;WifiConfiguration 构造器废弃 |
迁移至 WifiScanner 类;使用 WifiNetworkSpecifier 构建连接请求 |
| 13+ | 引入 WifiNetworkSuggestion API;enableNetwork 完全废弃 |
推荐使用 WifiNetworkSuggestion.Builder() 提供网络建议;系统自动选择最优网络 |
核心建议:优先采用 WifiNetworkSuggestion(Android 10+)替代传统 addNetwork,提升系统级兼容性与用户体验。
相关问答
Q1:为什么我的应用在 Android 11 上无法自动连接 Wi-Fi?
A:Android 11 限制后台应用调用 enableNetwork,解决方案:将连接逻辑移至前台服务,或改用 WifiNetworkSuggestion 让系统自动处理连接。
Q2:扫描热点时返回结果为空,但手机能搜到,怎么办?
A:检查三点:① 是否授予 ACCESS_FINE_LOCATION;② Wi-Fi 是否开启;③ 扫描频率是否超限(≤4次/分钟),若使用 getScanResults(),需在主线程外调用。
你是否在安卓 Wi-Fi 开发中遇到过难以复现的连接问题?欢迎在评论区分享你的解决方案!
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/175765.html