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

为何带NET_CAPABILITY_INTERNET的WifiNetworkSpecifier总是触发onUnavailable?

使用WifiNetworkSpecifier连接WiFi热点时onUnavailable触发的排查方案

你遇到的问题是调用requestNetwork后,NetworkCallback始终触发onUnavailable,可以从以下几个方向排查:

1. 权限与位置服务未正确配置

Android 10及以上版本,使用WifiNetworkSpecifier需要以下权限,且必须动态申请,同时设备的位置服务必须开启:

  • ACCESS_FINE_LOCATION:扫描WiFi热点依赖位置权限
  • CHANGE_WIFI_STATE:修改WiFi连接状态需要该权限

先在Manifest中添加权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

再在代码中动态申请这两个权限,确认用户授权后再执行连接逻辑。

2. WiFi热点信息不匹配

  • 隐藏热点未声明:如果目标WiFi是隐藏热点,必须在WifiNetworkSpecifier.Builder中调用setHiddenSsid(true),否则系统无法扫描到该热点:
    val networkSpecifier: NetworkSpecifier = WifiNetworkSpecifier.Builder()
            .setSsid("SsidName")
            .setWpa2Passphrase("wifipassword")
            .setHiddenSsid(true) // 隐藏热点需添加此行
            .build()
    
  • 加密方式不匹配:你当前用的是setWpa2Passphrase,如果目标热点是WPA3加密,需要替换为setWpa3Passphrase;如果是开放热点(无密码),则不要调用任何密码相关方法。
  • SSID拼写错误:确认SSID完全匹配,注意大小写,部分设备对SSID大小写敏感。

3. NetworkRequest的能力要求过高

你在NetworkRequest中添加了NET_CAPABILITY_INTERNET,如果目标WiFi热点本身没有互联网连接,系统会判定该网络不满足要求,直接触发onUnavailable。可以先移除这个能力要求,测试是否能连接:

val networkRequest: NetworkRequest = NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    // .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) 先注释此行测试
    .setNetworkSpecifier(networkSpecifier)
    .build()

4. 系统版本与厂商限制

  • WifiNetworkSpecifier仅在Android 10(API 29)及以上版本可用,低版本系统无法使用该API。
  • 部分厂商的定制系统(如小米、华为)对WiFi连接有额外的权限管控,可能需要在系统设置中允许应用修改WiFi连接。

5. 回调超时设置

你设置了100000ms的超时时间,如果连接过程中出现延迟,也可能触发onUnavailable。可以尝试移除超时参数,或者延长超时时间:

connectivityManager.requestNetwork(networkRequest, callback) // 移除超时参数

内容的提问来源于stack exchange,提问作者georgiecasey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:39:19