为何带NET_CAPABILITY_INTERNET的WifiNetworkSpecifier总是触发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
相关产品推荐
相关产品推荐

