Android 9无需互联网连接即可连接到Wifi

mfpqipee  于 2023-05-12  发布在  Android
关注(0)|答案(1)|浏览(225)

我为Android 9写了一个Android应用程序,它向用户显示可用WiFi网络的列表,并让用户连接到它们。连接到提供互联网连接的网络工作正常。但在大多数情况下,我必须连接到没有互联网连接的网络。对于我的项目,我必须在linux机器上创建自己的接入点/热点,因此希望我的应用程序能够连接到它。
如果我选择一个我创建的网络,我会重新连接到一个已知的和已经配置的wifi,我的设备知道它提供互联网连接(例如我们的办公室wifi)。
我已经对stackoverflow进行了详细的研究,但大多数有此问题的人似乎都在使用Android Marshmallow或Lollipop,实际上他们的设备在连接到非互联网WiFi时使用移动的数据发送/接收数据。
AFAIK Android可能会拒绝不提供互联网接入的WiFi网络。我如何告诉系统连接到它们?通过设置应用程序连接到这些网络工作正常。只是我的应用程序不能用。
以下是我目前为止的连接代码:

private fun connectToSelectedNetwork(networkSSID: String){
    try {
        val conf = WifiConfiguration()
        conf.SSID = "\"" + networkSSID + "\""
        conf.preSharedKey = "\"" + PASSPHRASE + "\""

        val network = wifiManager?.addNetwork(conf)
        wifiManager?.disconnect()
        wifiManager?.enableNetwork(network!!, true)
        wifiManager?.reconnect()
    } catch (ex: Exception) {
        println(Arrays.toString(ex.stackTrace))
    }
}
tv6aics1

tv6aics11#

对于任何可能有同样问题的人,以下是我如何解决它:
1.为了确保您的设备不会重新连接到您上一次连接的wifi网络,只需在尝试连接到新的wifi网络(可能没有互联网功能)之前禁用当前连接的网络。此外,我首先检查我想连接的网络是否已经为设备所知,这使我们不必创建新的WiFi配置。
1.有时,连接到网络可能需要一分钟以上。我真的不知道为什么,但我也找到了一个解决办法。每当我尝试使用上述解决方案连接到新网络时,我都会启动一个计时器,该计时器在一定时间段后超时(在我的情况下为5秒)。一旦连接建立成功,我就停止计时器。但如果超时后没有建立连接,我只需重试连接到所需的网络。在大多数情况下(>95%),连接在10秒内成功。
下面是我的工作代码:

private lateinit var timeoutCoroutine: Job

    private fun connectToSelectedNetwork(SSID: String) {
        // Figure out if the network is known to the device and in this case connect to it
        if (!connectToKnownNetwork(SSID)){
            // If the network is unknown, we first have to configure it before connecting
            val network = configureNetwork(SSID)
            connect(network)
        }
        startConnectionEstablishmentTimeoutCoroutine(SSID)
    }

    private fun connectToKnownNetwork(SSID: String): Boolean {
        for (c in wifiManager.configuredNetworks) {
            if (SSID == c.SSID.removeSurrounding("\"")){
                if (connect(c.networkId)){
                    return true
                }
            }
        }
        return false
    }

    private fun configureNetwork(SSID: String): Int {
        val conf = WifiConfiguration()
        conf.SSID = "\"" + SSID + "\""
        conf.preSharedKey = "\"" + PASSPHRASE + "\""
        conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK)
        return wifiManager.addNetwork(conf)
    }

    private fun connect(network: Int): Boolean {
        wifiManager.disableNetwork(wifiManager.connectionInfo.networkId)
        wifiManager.disconnect()
        val success = wifiManager.enableNetwork(network, true)
        wifiManager.reconnect()
        wifiManager.reassociate()
        return success
    }

    // For unknown reasons connecting to a network takes up to a minute when the user has not
    // interacted with the device for a while (>~15 seconds).
    // To prevent this we set a timeout after which the connection establishment shall be retried.
    private fun startConnectionEstablishmentTimeoutCoroutine(SSID: String){
        timeoutCoroutine = CoroutineScope(IO).launch {
            delay(CONNECTION_ESTABLISHMENT_TIMEOUT)
            connectToNetwork(SSID)
        }
    }

相关问题