taontech / githublog

一个基于github issues的博客系统,实时呈现,零依赖,零代码部署,不用打包不用上线。
4 stars 1 forks source link

自动连接临时网络的关键的一点 #78

Open taontech opened 1 year ago

taontech commented 1 year ago

上次的代码,虽然能自动连上网络,但是会不能访问内容,并不能访问

private fun android10andMoreVersionsWithoutOuterInternet(
        wifiSSID: String,
        wifiPassword: String
    ) {
        // Android 10 (API level 29) -- Android Q (Android 10)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            val wifiManager =
                this.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

            val wifiNetworkSpecifier = WifiNetworkSpecifier.Builder()
                .setSsid(wifiSSID)
                .setWpa2Passphrase(wifiPassword)
                .build()

            val networkRequest = NetworkRequest.Builder()
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                .setNetworkSpecifier(wifiNetworkSpecifier)
                .build()
            val connectivityManager =
                this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

            val networkCallback = object : ConnectivityManager.NetworkCallback() {
                override fun onAvailable(network: Network) {
                    Log.d("NETWORK", "Network available")
                    super.onAvailable(network)

                    // To make sure that requests don't go over mobile data
                    // 这行代码必须得有,否则无法上网
                    connectivityManager.bindProcessToNetwork(network)
                }

                override fun onUnavailable() {
                    Log.d("NETWORK", "Network unavailable")
                    super.onUnavailable()
                }

                override fun onLosing(network: Network, maxMsToLive: Int) {
                    Log.d("NETWORK", "onLosing")
                    super.onLosing(network, maxMsToLive)
                }

                override fun onLost(network: Network) {
                    Log.d("NETWORK", "onLost")
                    super.onLost(network)

                    connectivityManager.bindProcessToNetwork(null)
                    connectivityManager.unregisterNetworkCallback(this)
                }

            }
            connectivityManager.requestNetwork(networkRequest, networkCallback)
            connectivityManager.registerNetworkCallback(networkRequest, networkCallback) // For listen
        }

    }

最关键的是下面的代码

            val networkCallback = object : ConnectivityManager.NetworkCallback() {
                override fun onAvailable(network: Network) {
                    Log.d("NETWORK", "Network available")
                    super.onAvailable(network)

                    // To make sure that requests don't go over mobile data
                    // 这行代码必须得有,否则无法上网
                    connectivityManager.bindProcessToNetwork(network)
                }
          }