小编Luj*_*a93的帖子

Android Q 总是重复使用第一个输入的凭据连接到 WiFi 网络

我正在尝试使用 Android Q 上的 WifiNetworkSpecifier 连接到 WiFi。我遇到的问题是 Android 始终使用最后一个有效凭据连接到 AP,即使在我手动向 WifiNetworkSpecifier 提供新的更新凭据之后也是如此。

这是流程:

  1. 连接AP成功。
  2. 更改 WiFi 网络的密码。
  3. 运行应用程序,尝试使用更新的凭据(提供新的有效密码)再次连接,但应用程序无法连接到 WiFi(身份验证失败)。

如果我颠倒逻辑,同样的事情会发生:

  1. 成功连接到WiFi。
  2. 运行该应用程序,为其提供更新的凭据(新的、假密码),但该应用程序设法连接到 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 …
Run Code Online (Sandbox Code Playgroud)

android android-networking android-wifi android-connectivitymanager android-10.0

10
推荐指数
0
解决办法
526
查看次数

在 Android Q 上结合 WiFi 说明符和建议 API

我正在构建一个应用程序,其中与第二个设备的连接是本质。因此,我使用了WifiNetworkSpecifier API。但是,一旦用户离开并返回 Wi-Fi 边界,应用程序必须能够自动重新连接到目标网络。因此,我使用了WifiNetworkSuggestion API。但是,我在那里遇到了几个问题:

  1. 使用说明符 API 连接到 SSID 并确认建议 API 生成的推送通知后,建议 API 似乎不起作用,直到我手动断开与 SSID 的连接(取消注册先前分配给说明符请求的网络回调)或杀死应用程序。
  2. 如果用户之前使用 OS Wi-Fi 管理器(例如热点)连接到的外围存在另一个网络,Android 将优先考虑该网络,因此我的应用程序的建议 API 永远不会自动重新连接到想要的和可访问的 SSID。

到目前为止,根据我的经验和理解(这可能是错误的),似乎我们必须手动取消注册先前分配给说明符请求的网络回调,或者终止应用程序,然后让建议 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

5
推荐指数
1
解决办法
768
查看次数