在安卓开发中实现稳定、高效的Wi-Fi连接,核心在于精准调用系统API、合理处理权限与生命周期、规避常见兼容性陷阱,以下从技术实现、权限管理、兼容性适配、性能优化四个维度展开,提供可落地的解决方案。

Wi-Fi操作核心API调用规范(Android 10+)
Android 10起,Wi-Fi操作权限大幅收紧,必须区分场景调用不同API:
-
扫描Wi-Fi网络
WifiManager.getScanResults():仅限前台服务或用户交互触发,后台调用返回空列表WifiManager.requestScan():需ACCESS_FINE_LOCATION权限(Android 9+)- 替代方案:使用
WifiManager.getAvailableConnections()(Android 12+废弃)或WifiManager.getNetworkSuggestions()(推荐)
-
连接指定网络
- Android 10+:禁止直接调用
addNetwork()+enableNetwork()(系统限制) - 正确方式:
- 公开网络:调用
WifiManager.openWifiConfigUi()跳转系统配置页 - 密码网络:使用
WifiNetworkSpecifier.Builder+ConnectivityManager.requestNetwork()(需CHANGE_WIFI_STATE权限) - 示例代码片段:
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder() .setSsid("MyNetwork") .setWpa2Passphrase("password123") .build(); NetworkRequest request = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .setNetworkSpecifier(specifier) .build(); connectivityManager.requestNetwork(request, callback);
- 公开网络:调用
- Android 10+:禁止直接调用
-
断开/切换网络
WifiManager.disconnect():仅影响当前连接,不移除配置WifiManager.forget(networkId):彻底删除网络配置(需CHANGE_WIFI_STATE)
权限管理与动态申请策略
权限申请必须分层处理,避免因权限缺失导致功能崩溃:
| 权限名称 | 用途 | Android版本限制 | 申请时机 |
|---|---|---|---|
ACCESS_WIFI_STATE |
查询Wi-Fi状态 | 全版本可用 | 启动时静态声明 |
CHANGE_WIFI_STATE |
开关Wi-Fi、添加网络 | 全版本可用 | 启动时静态声明 |
ACCESS_FINE_LOCATION |
扫描Wi-Fi(Android 9+) | Android 9+必须动态申请 | 扫描前请求 |
ACCESS_COARSE_LOCATION |
替代方案(精度要求低) | Android 9+ | 可选 |
CHANGE_WIFI_STATE + CHANGE_NETWORK_STATE |
网络切换(Android 10+) | Android 10+ | 启动时声明 |
关键实践:
- 在
AndroidManifest.xml中声明<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />等基础权限 - 运行时检查:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1001); } }
兼容性适配重点(Android 10~14)
三大高频兼容性问题及解决方案:

-
Android 10+后台扫描限制
- 问题:后台服务调用
requestScan()返回空结果 - 解决:
- 将扫描逻辑移至前台服务(
startForeground()) - 使用
WifiScanner类(需CHANGE_WIFI_STATE+ACCESS_WIFI_STATE)
- 将扫描逻辑移至前台服务(
- 问题:后台服务调用
-
Android 11+应用作用域存储限制
- 问题:无法读取系统Wi-Fi配置文件
- 解决:完全依赖系统API,禁止直接访问
/data/misc/wifi/等路径
-
Android 12+Wi-Fi权限合并
- 问题:
ACCESS_WIFI_STATE与CHANGE_WIFI_STATE被归入android.permission-group.NETWORK - 解决:在
targetSdkVersion=31,统一使用Manifest.permission.ACCESS_WIFI_STATE声明
- 问题:
性能与稳定性优化方案
四步提升Wi-Fi连接成功率:
-
连接前校验
- 检查
WifiManager.isWifiEnabled(),未开启则提示用户 - 验证网络是否已存在:
WifiConfiguration中遍历getConfiguredNetworks()
- 检查
-
重连机制设计
- 监听
WifiManager.NETWORK_STATE_CHANGED_ACTION广播 - 实现指数退避重连:首次失败后5s重试,失败后10s、20s、40s…
- 监听
-
弱信号处理

- 通过
WifiManager.getConnectionInfo().getRssi()获取信号强度 - 当RSSI < -85dBm时,提示用户靠近路由器
- 通过
-
内存泄漏规避
- 广播接收器必须在
onDestroy()中unregisterReceiver() - 使用
WeakReference包装回调对象
- 广播接收器必须在
相关问答
Q1:安卓12及以上版本能否通过代码自动连接隐藏Wi-Fi网络?
A:可以,但需满足三个条件:
① 使用WifiNetworkSpecifier指定setHiddenSsid(true);
② 持有CHANGE_WIFI_STATE权限;
③ 网络配置通过ConnectivityManager.requestNetwork()发起。
Q2:为什么调用WifiManager.enableNetwork()在Android 10+无效?
A:系统限制:从Android 10起,Google禁止应用直接启用非当前应用创建的网络配置,解决方案是改用WifiNetworkSpecifier或引导用户通过系统UI完成连接。
欢迎在评论区分享你的Wi-Fi开发踩坑经历,或提出具体技术问题,我们将逐一解答。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/171096.html