Android 12+应用通过WiFi Network Request API连WiFi无网络时异常求助
解决无互联网WiFi连接问题的方案
1. 调整NetworkRequest的能力配置
Android系统默认的NetworkRequest会要求网络具备互联网能力,当WiFi无互联网时,系统会判定该网络不满足请求条件,导致onUnavailable触发或连接后被断开。需根据系统版本调整配置:
针对Android 12+(API 31及以上)
直接使用requestNetwork的重载方法,传入requestWithoutInternet=true参数,明确告知系统允许请求无互联网的网络:
cm.requestNetwork( networkRequest, WifiConnectionCallBack(connectionWatcher, item.bssid, cm, onConnection), true // 允许请求无互联网的网络 )
针对Android 11及以下(API 30及以下)
修改NetworkRequest的能力配置,移除对互联网的要求,并添加允许无限制网络的能力:
val networkRequest = NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) // 移除互联网能力要求 .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) // 允许无限制网络 .setNetworkScoreFilter(NetworkScoreManager.SCORE_FILTER_NONE) // 忽略网络评分,强制接受该网络 .setNetworkSpecifier(builder.build()) .build()
2. 优化NetworkCallback逻辑
- 在
onAvailable中,除绑定进程到网络,可额外设置该网络为进程默认网络,确保应用流量走目标WiFi:
override fun onAvailable(network: Network) { super.onAvailable(network) // 绑定进程到网络 val bindResult = connManager.bindProcessToNetwork(network) // 兼容旧版本,设置为进程默认网络 connManager.setProcessDefaultNetwork(network) onConnection.invoke(bindResult, network) connectionWatcher.onChangeState(ConnectionState.WifiConnected(bssid, network)) }
- 处理
onLost回调:若网络意外断开,可根据业务需求重新发起连接请求,避免系统自动切换到其他网络。
3. 确认权限配置
确保应用已申请必要权限:
ACCESS_FINE_LOCATION:Android Q及以上扫描WiFi需此权限(即使是已知WiFi)ACCESS_WIFI_STATE和CHANGE_WIFI_STATE:WiFi操作基础权限- Android 13+(API 33)需
NEARBY_WIFI_DEVICES权限替代部分位置权限需求
在Manifest中声明:
<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" /> <!-- Android 13+ --> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" />
并在运行时动态申请位置权限(Android Q及以上)。
4. 避免系统自动切换网络
若系统频繁切换到有互联网的网络,可尝试:
- 连接无互联网WiFi后,暂时禁用移动数据(需
CHANGE_NETWORK_STATE权限),但此操作会影响应用其他网络需求,需谨慎使用。 - 使用
ConnectivityManager.requestNetwork时设置较长超时时间,确保系统有足够时间完成连接。
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

