Detectar conexión a internet en Android Kotlin


Si se quiere detectar si el dispositivo tiene conexión a internet usando Kotlin, el método isInternetReachable realiza una petición a google si se consigue transmitir y recibir con exito, devuelve true, la petición está optimizada para que no pida más datos de su proposito

@RequiresPermission(anyOf = [Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.INTERNET])
fun isInternetReachable(context: Context): Boolean {
    if (isNetworkAvailable(context)) {
        try {
            val httpConnection: HttpURLConnection = URL("https://clients3.google.com/generate_204")
                .openConnection() as HttpURLConnection
            httpConnection.setRequestProperty("User-Agent", "Android")
            httpConnection.setRequestProperty("Connection", "close")
            httpConnection.connectTimeout = 1500
            httpConnection.connect()

            return httpConnection.responseCode == 204
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
    return false
}urn false
}

Función isNetworkAvailable

@RequiresPermission(Manifest.permission.ACCESS_NETWORK_STATE)
fun isNetworkAvailable(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val activeNetwork = connectivityManager.activeNetwork ?: return false
        val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) ?: return false
        return when {
            networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
            networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
            networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> true
            networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
            else -> false
        }
    } else @Suppress("deprecation") {
        val activeNetwork = connectivityManager.activeNetworkInfo ?: return false
        return activeNetwork.isConnectedOrConnecting
    }
}

Su uso

Para usar la función es necesatio tener los permisos de solicitar Internet y estado de conexión en AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Luego para la petición se debe hacer en un proceso en segundo plano, en Kotlin se recomienda usar corotinas, desde una actividad o fragmento

GlobalScope.async {
    if (isInternetReachable(requireContext())) {
        //Acción con internet
    } else {
        //Mostrar mensaje de error
    }
}

Anuncio publicitario

Publicado por Codelaby

Mobile DevDesigner

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: