我正在尝试使用 Android Q 上的 WifiNetworkSpecifier 连接到 WiFi。我遇到的问题是 Android 始终使用最后一个有效凭据连接到 AP,即使在我手动向 WifiNetworkSpecifier 提供新的更新凭据之后也是如此。
这是流程:
如果我颠倒逻辑,同样的事情会发生:
关键是,一旦它使用有效凭据连接到 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 …Run Code Online (Sandbox Code Playgroud) android android-networking android-wifi android-connectivitymanager android-10.0
我正在构建一个应用程序,其中与第二个设备的连接是本质。因此,我使用了WifiNetworkSpecifier API。但是,一旦用户离开并返回 Wi-Fi 边界,应用程序必须能够自动重新连接到目标网络。因此,我使用了WifiNetworkSuggestion API。但是,我在那里遇到了几个问题:
到目前为止,根据我的经验和理解(这可能是错误的),似乎我们必须手动取消注册先前分配给说明符请求的网络回调,或者终止应用程序,然后让建议 API 完成它的工作,直到它可以工作适当地。如果边界中存在其他网络(用户之前使用 OS Wi-Fi 管理器连接到该网络),这可能会出现问题。在这种情况下,我们永远不会自动重新连接到应用程序定义的 SSID,建议 API 也永远不会工作。
问题是:如何将这两个 API 结合起来,以便能够连接到 SSID,但又可以自动重新连接,而不会进行手动断开用户连接或杀死应用程序等丑陋的黑客攻击,这也不能给我们任何保证?
在我看来,这个使用新网络 API 的全新实现做得不好,它给开发人员带来了很多问题和限制,或者至少它的文档很差。
这是用于发出请求的代码。请注意,我连接的设备没有实际的互联网访问权限,它只是用作 p2p 网络。
@RequiresApi(api = Build.VERSION_CODES.Q)
private fun connectToWiFiOnQ(wifiCredentials: WifiCredentials, onUnavailable: () -> Unit) {
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(createWifiNetworkSpecifier(wifiCredentials))
.build()
networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
connectivityManager.bindProcessToNetwork(network)
}
override …Run Code Online (Sandbox Code Playgroud) android internet-connection android-networking android-wifi android-10.0