我正在尝试使用 Android Q 上的 WifiNetworkSpecifier 连接到 WiFi。我遇到的问题是 Android 始终使用最后一个有效凭据连接到 AP,即使在我手动向 WifiNetworkSpecifier 提供新的、更新的凭据之后也是如此。
这是流程:
- 成功连接AP。
- 更改 WiFi 网络的密码。
- 运行应用程序,尝试使用更新的凭据(提供新的有效密码)再次连接,但应用程序无法连接到 WiFi(身份验证失败)。
如果我颠倒逻辑,也会发生同样的事情:
- 成功连接到WiFi。
- 运行应用程序,为其提供更新的凭据(新的、错误的密码),但应用程序设法连接到 WiFi。
关键是,一旦它使用有效凭据连接到 SSID,无论我放入 WifiNetworkSpecifier 似乎都没有任何区别,它只是一遍又一遍地使用最后一个有效凭据。
这发生在 Google Pixel 2 和华为 P30 Lite 上。但是,在三星 Galaxy S9 上一切正常(如果我更新 WiFi 网络密码并为应用程序提供新的有效密码,应用程序将连接到 WiFi 网络;如果我提供它,它将无法连接到 WiFi假密码,都假设我们之前成功连接到 WiFi)。
重新启动设备后,Pixel 和华为的问题得到“解决”,但是当我再次连接到 WiFi(输入有效凭据)时,我们又回到了同样的问题。
我不确定我是否在这里遗漏了一些琐碎的事情,但我们将不胜感激任何帮助!谢谢!
编辑:事实证明,您不必输入有效凭据即可触发此循环。例如,如果您第一次尝试使用错误密码连接 AP,并且尝试使用正确密码连接后,系统会使用此错误密码(第一次输入的密码)进行连接。同样,这发生在 Pixel 2 和华为 P30 Lite 上,但在 Galaxy S9 和 S9+ 上运行良好。重新启动手机仍会清除此“状态”。
这是代码:
@RequiresApi(api = Build.VERSION_CODES.Q)
private fun connectToWiFiOnQ(context: Context, wifiCredentials: WifiCredentials) {
val connectivityManager: ConnectivityManager =
context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkSpecifier = WifiNetworkSpecifier.Builder()
.setSsid(wifiCredentials.networkSSID)
.setWpa2Passphrase(wifiCredentials.password)
.setIsHiddenSsid(wifiCredentials.isSSIDHidden)
.build()
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(networkSpecifier)
.build()
networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
connectivityManager.bindProcessToNetwork(network)
}
}
networkCallback?.let {
connectivityManager.requestNetwork(request, it)
}
}