android - 为什么具有 NET_CAPABILITY_INTERNET 功能的 WifiNetworkSpecifier 总是返回 onUnavailable?

标签 android android-wifi android-10.0 android-11 android-connectivitymanager

我正在尝试使用这样的代码让我的应用程序连接到 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

enter image description here

因此,如果您 .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/

相关文章:

android - AdView 实例化失败

android - 成功建立 Wifi 连接后,使用 WifiManager.NETWORK_STATE_CHANGED_ACTION 接收广播是否安全?

linux - 在 Linux 中使用 wpa_cli 与 Android 的 WiFi P2P

Android Q Beta - 从包创建时 ContentValue 为空

屏幕变黑后,Java Android 套接字立即被杀死

android - ScrollView 禁用焦点移动

android - 可扩展 kotlin 中的 TextView

android - 可以从 Android 应用程序计算 Wi-Fi 中使用的数据量

android - Android 10 如何设置文件为铃声?

java - AndroidX : Parcelable encountered IOException writing serializable object only in Android version 10 devices