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
}
}