Stefan
Stefan

Reputation: 4231

Connectivity Manager - AllNetworks Deprecated

Can someone point me in the right direction when it comes to replacing this deprecated code for checking the internet connection on a device?

private val isNetworkAvailable = MutableStateFlow(false)

fun checkNetworkAvailability(context: Context): MutableStateFlow<Boolean> {

    val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    connectivityManager.registerDefaultNetworkCallback(this)

    var isConnected = false
    // allNetworks Deprecated
    connectivityManager.allNetworks.forEach { network ->
        val networkCapability = connectivityManager.getNetworkCapabilities(network)
        networkCapability?.let {
            if(it.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
                isConnected = true
                return@forEach
            }
        }
    }

    isNetworkAvailable.value = isConnected

    return isNetworkAvailable
}

Upvotes: 5

Views: 2859

Answers (1)

Nitish
Nitish

Reputation: 3411

You can fetch the active network and check it's currently connected or not using NetworkCapabilities

private fun isNetworkAvailable(): Boolean {
        val connectivityManager =
            getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val network = connectivityManager.activeNetwork // network is currently in a high power state for performing data transmission. 
            Log.d("Network", "active network $network")
            network ?: return false // return false if network is null
            val actNetwork = connectivityManager.getNetworkCapabilities(network) ?: return false // return false if Network Capabilities is null
            return when {
                actNetwork.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> { // check if wifi is connected
                    Log.d("Network", "wifi connected")
                    true
                }
                actNetwork.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> { // check if mobile dats is connected
                    Log.d("Network", "cellular network connected")
                    true
                }
                else -> {
                    Log.d("Network", "internet not connected")
                    false
                }
            }
        }
        else{
          val activeNetwork = connectivityManager.activeNetworkInfo

          return if (activeNetwork != null) {
            when (activeNetwork.type) {
                ConnectivityManager.TYPE_WIFI -> true
                ConnectivityManager.TYPE_MOBILE -> true
                else -> false
            }
           }else {
            false
           }
         }
    }

Note: connectivityManager.activeNetwork requires permission android.permission.ACCESS_NETWORK_STATE

Upvotes: 12

Related Questions