You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:20:27