我正在尝试使用这样的代码让我的应用程序连接到 WiFi AP,以通过 WifiNetworkSpecifier 提供互联网。但它总是在 NetworkCallback 中调用 onUnavailable
。
private val callback: ConnectivityManager.NetworkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
}
override fun onLost(network: Network) {
super.onLost(network)
}
override fun onLosing(network: Network, maxMsToLive: Int) {
super.onLosing(network, maxMsToLive)
}
override fun onUnavailable() {
super.onUnavailable()
}
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities)
}
override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
super.onLinkPropertiesChanged(network, linkProperties)
}
override fun onBlockedStatusChanged(network: Network, blocked: Boolean) {
super.onBlockedStatusChanged(network, blocked)
}
}
val networkSpecifier: NetworkSpecifier = WifiNetworkSpecifier.Builder()
.setSsid("SsidName")
.setWpa2Passphrase("wifipassword")
.build()
val networkRequest: NetworkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(networkSpecifier)
.build()
connectivityManager.requestNetwork(networkRequest, callback, 100000)
最佳答案
WifiNetworkSpecifier 仅用于连接到仅限本地的 Wifi 网络,例如,用于设置 IoT 设备,如下所示: https://developer.android.com/guide/topics/connectivity/wifi-bootstrap
因此,如果您 .addCapability(NetworkCapability.NET_CAPABILITY_INTERNET)
,Android 将始终不执行任何操作并调用 onUnavailable
。
您可以在此处的 Android 平台代码中了解原因:https://cs.android.com/android/platform/superproject/+/master:packages/modules/Wifi/service/java/com/android/server/wifi/WifiNetworkFactory.java;drc=08124f52b883c61f3e17bc57dc28eca4c7f7bb72;l=487
LogCat 中的消息将是 E/WifiNetworkFactory: 带 wifi 网络说明符的请求不能包含 NET_CAPABILITY_INTERNET。拒绝
如果您想要互联网,则需要删除 .addCapability(NetworkCapability.NET_CAPABILITY_INTERNET)
行(这很有意义,哇!)并添加 connectivityManager.bindProcessToNetwork(network)
在 onAvailable
中,如 this answer 中所述。请注意,这有点黑客行为,只会为您的应用程序通过 Wifi 启用互联网。
关于android - 为什么具有 NET_CAPABILITY_INTERNET 功能的 WifiNetworkSpecifier 总是返回 onUnavailable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73178257/