Force Android to Use Wifi network with no internet

前端 未结 5 914
猫巷女王i
猫巷女王i 2020-12-24 06:23

I am building an android app that needs to communicate over a WiFi network that will not have any internet access. The problem is that even when the WiFi is connected androi

5条回答
  •  情深已故
    2020-12-24 06:51

    Solution on Kotlin

    class ConnectWithoutInternetTest constructor(
    private val mContext: Context,
    private val connectivityManager: ConnectivityManager,
    private val wifiManager: WifiManager
    ) {
    
    private val mWifiBroadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            when (intent.action) {
                WifiManager.NETWORK_STATE_CHANGED_ACTION -> {
                    val info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO)
                    val isConnected = info.isConnected
    
                    val ssid: String? = normalizeAndroidWifiSsid(wifiManager.connectionInfo?.ssid)
    
                    if (isConnected) {
                        val builder = NetworkRequest.Builder()
                        builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                        connectivityManager.registerNetworkCallback(
                            builder.build(),
                            object : ConnectivityManager.NetworkCallback() {
                                override fun onAvailable(network: Network) {
                                    super.onAvailable(network)
                                    val networkInfo = connectivityManager.getNetworkInfo(network)
                                    val networkSsid = networkInfo.extraInfo
                                    if (networkSsid == ssid) {
                                        connectivityManager.unregisterNetworkCallback(this)
                                    }
                                }
                            })
                    }
                }
            }
        }
    }
    
    private fun init() {
        val intentFilter = IntentFilter()
        intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION)
        mContext.registerReceiver(mWifiBroadcastReceiver, intentFilter)
    }
    
    private fun destroy() {
        mContext.unregisterReceiver(mWifiBroadcastReceiver)
    }
    
    private fun normalizeAndroidWifiSsid(ssid: String?): String? {
        return ssid?.replace("\"", "") ?: ssid
    }
    
    fun connectToWifi(ssidParam: String, password: String?) {
        init()
        val ssid = "\"$ssidParam\""
        val config = wifiManager.configuredNetworks.find { it.SSID == ssid }
        val netId = if (config != null) {
            config.networkId
        } else {
            val wifiConfig = WifiConfiguration()
            wifiConfig.SSID = ssid
            password?.let { wifiConfig.preSharedKey = "\"$password\"" }
            wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE)
            wifiManager.addNetwork(wifiConfig)
        }
    
        wifiManager.disconnect()
        val successful = wifiManager.enableNetwork(netId, true)
    }
    

提交回复
热议问题