internet example connectivitymanager change android networking android-6.0-marshmallow android-connectivitymanager

example - android detect internet connection change



ConnectivityManager getNetworkInfo(int) en desuso (17)

(Casi) Todas las respuestas están en desuso en Android P, así que aquí está la solución C# ( que es fácil de seguir para los desarrolladores de Java )

public bool IsOnline(Context context) { var cm = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService); if (cm == null) return false; if (Build.VERSION.SdkInt < BuildVersionCodes.M) { var ni = cm.ActiveNetworkInfo; if (ni == null) return false; return ni.IsConnected && (ni.Type == ConnectivityType.Wifi || ni.Type == ConnectivityType.Mobile); } return cm.GetNetworkCapabilities(cm.ActiveNetwork).HasTransport(Android.Net.TransportType.Wifi) || cm.GetNetworkCapabilities(cm.ActiveNetwork).HasTransport(Android.Net.TransportType.Cellular); }

La clave aquí es Android.Net.TransportType

Usando compileSdkVersion 23 , sin embargo, tratando de soportar desde 9.

getNetworkInfo(int) quedó en desuso en 23. La sugerencia fue utilizar getAllNetworks() y getNetworkInfo(Network) lugar. Sin embargo, ambos requieren un mínimo de API 21.

¿Hay alguna clase que podamos usar en el paquete de soporte que pueda ayudar con esto?

Sé que se propuso una solución before , sin embargo, el desafío de mis requisitos mínimos de API de 9 plantea un problema.


Así es como verifico si la red actual está usando celular o no en las últimas versiones de Android:

val isCellular: Boolean get() { val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { cm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) } else { cm.activeNetworkInfo?.type == ConnectivityManager.TYPE_MOBILE } }


Como sugirió Cheese Bread , use getActiveNetworkInfo()

getActiveNetworkInfo

Agregado en API nivel 1

NetworkInfo getActiveNetworkInfo ()

Devuelve detalles sobre la red de datos predeterminada actualmente activa. Cuando está conectada, esta red es la ruta predeterminada para las conexiones salientes. Siempre debe verificar isConnected () antes de iniciar el tráfico de red. Esto puede devolver nulo cuando no hay una red predeterminada. Este método requiere que la persona que llama tenga el permiso ACCESS_NETWORK_STATE. Devuelve NetworkInfo un objeto NetworkInfo para la red predeterminada actual o nulo si actualmente no hay ninguna red predeterminada activa.

Referencia: Android Studio

public final boolean isInternetOn() { // get Connectivity Manager object to check connection ConnectivityManager connec = (ConnectivityManager)getSystemService(getBaseContext().CONNECTIVITY_SERVICE); // Check for network connections if ( connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.CONNECTED || connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.CONNECTING ) { // if connected with internet Toast.makeText(this, connec.getActiveNetworkInfo().getTypeName(), Toast.LENGTH_LONG).show(); return true; } else if ( connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.DISCONNECTED || connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.DISCONNECTED ) { Toast.makeText(this, " Not Connected ", Toast.LENGTH_LONG).show(); return false; } return false; }

ahora llame al método, para un uso seguro intente catch

try { if (isInternetOn()) { /* connected actions */ } else { /* not connected actions */ } } catch (Exception e){ Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); }

Y no olvides agregar:

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


Dado que las respuestas publicadas solo le permiten consultar la red activa, aquí le NetworkInfo cómo obtener NetworkInfo para cualquier red, no solo la activa (por ejemplo, la red Wifi) (lo siento, código Kotlin más adelante)

(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).run { allNetworks.find { getNetworkInfo(it).type == ConnectivityManager.TYPE_WIFI }?.let { network -> getNetworkInfo(network) } // getNetworkInfo(ConnectivityManager.TYPE_WIFI).isAvailable // This is the deprecated API pre-21 }

Esto requiere API 21 o superior y el permiso android.permission.ACCESS_NETWORK_STATE


Es bueno verificar si su red está conectada a Internet:

public static boolean isNetworkConnected(Context context) { boolean result = false; ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (cm != null) { NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); if (capabilities != null) { if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { result = true; } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { result = true; } } } } else { if (cm != null) { NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (activeNetwork != null) { // connected to the internet if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { result = true; } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { result = true; } } } } return result; }


Es posible que necesitemos verificar la conectividad a Internet más de una vez. Entonces será más fácil para nosotros si escribimos el bloque de código en un método de extensión de Context . A continuación se encuentran mis extensiones de ayuda para Context and Fragment .

Comprobación de la conexión a Internet

fun Context.hasInternet(): Boolean { val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager return if (Build.VERSION.SDK_INT < 23) { val activeNetworkInfo = connectivityManager.activeNetworkInfo activeNetworkInfo != null && activeNetworkInfo.isConnected } else { val nc = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) if (nc == null) { false } else { nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) } } }

Otras extensiones

fun Context.hasInternet(notifyNoInternet: Boolean = true, trueFunc: (internet: Boolean) -> Unit) { if (hasInternet()) { trueFunc(true) } else if (notifyNoInternet) { Toast.makeText(this, "No Internet Connection!", Toast.LENGTH_SHORT).show() } } fun Context.hasInternet( trueFunc: (internet: Boolean) -> Unit, falseFunc: (internet: Boolean) -> Unit ) { if (hasInternet()) { trueFunc(true) } else { falseFunc(true) } } fun Fragment.hasInternet(): Boolean = context!!.hasInternet() fun Fragment.hasInternet(notifyNoInternet: Boolean = true, trueFunc: (internet: Boolean) -> Unit) = context!!.hasInternet(notifyNoInternet, trueFunc) fun Fragment.hasInternet( trueFunc: (internet: Boolean) -> Unit, falseFunc: (internet: Boolean) -> Unit ) = context!!.hasInternet(trueFunc, falseFunc)


La respuesta aceptada está en desuso en la versión 28, así que aquí está la solución que estoy usando en mi proyecto.

Devuelve el tipo de conexión. falso: sin conexión a Internet; verdadero: datos móviles || Wifi

@Suppress("DEPRECATION") fun isNetworkAvailable(context: Context): Boolean { try { val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager return if (Build.VERSION.SDK_INT > 22) { val an = cm.activeNetwork ?: return false val capabilities = cm.getNetworkCapabilities(an) ?: return false capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) } else { val a = cm.activeNetworkInfo ?: return false a.isConnected && (a.type == ConnectivityManager.TYPE_WIFI || a.type == ConnectivityManager.TYPE_MOBILE) } } catch (e: Exception) { e.printStackTrace() } return false }


Para estar seguro, sugeriría usar también el método

NetworkInfo.isConnected ()

Todo el método podría ser el siguiente:

/** * Checking whether network is connected * @param context Context to get {@link ConnectivityManager} * @return true if Network is connected, else false */ public static boolean isConnected(Context context){ ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (activeNetwork != null && activeNetwork.isConnected()) { int networkType = activeNetwork.getType(); return networkType == ConnectivityManager.TYPE_WIFI || networkType == ConnectivityManager.TYPE_MOBILE; } else { return false; } }


Para verificar si estás en línea:

boolean isOnline() { // Checking internet connectivity ConnectivityManager connectivityMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = null; if (connectivityMgr != null) { activeNetwork = connectivityMgr.getActiveNetworkInfo(); } return activeNetwork != null; }

Para obtener el tipo de conectividad a Internet antes / después de Android M

void internetType() { // Checking internet connectivity ConnectivityManager connectivityMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = null; if (connectivityMgr != null) { activeNetwork = connectivityMgr.getActiveNetworkInfo(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { NetworkCapabilities nc = connectivityMgr.getNetworkCapabilities(connectivityMgr.getActiveNetwork()); if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { // connected to mobile data } else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { // connected to wifi } } else { if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { // connected to wifi } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { // connected to mobile data } } } }

Todos los casos requieren un permiso para acceder al estado de la red

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


Puedes usar:

getActiveNetworkInfo ();

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (activeNetwork != null) { // connected to the internet if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { // connected to wifi } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { // connected to mobile data } } else { // not connected to the internet }

O en una caja de interruptor

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (activeNetwork != null) { // connected to the internet switch (activeNetwork.getType()) { case ConnectivityManager.TYPE_WIFI: // connected to wifi break; case ConnectivityManager.TYPE_MOBILE: // connected to mobile data break; default: break; } } else { // not connected to the internet }


Versión Kotlin:

fun isInternetOn(context: Context): Boolean { val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager val activeNetwork = cm?.activeNetworkInfo return activeNetwork != null && activeNetwork.isConnected }


verificar si Internet está disponible

@RequiresPermission(allOf = [ Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.INTERNET ]) fun isInternetAvailable(context: Context): Boolean { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? val activeNetworkInfo = connectivityManager!!.activeNetworkInfo return activeNetworkInfo != null && activeNetworkInfo.isConnected }


En octubre de 2018, la respuesta aceptada está en desuso.

getType() , y los tipos mismos, ahora están en desuso en el Nivel 28 de la API. Desde Javadoc:

Las personas que llaman deben cambiar a verificar NetworkCapabilities # hasTransport en su lugar con una de las constantes NetworkCapabilities # TRANSPORT *

Para usar NetworkCapabilities , debe pasar una instancia de Network al método getNetworkCapabilities() . Para obtener esa instancia, debe llamar a getActiveNetwork() que se agregó en el nivel 23 de API.

Así que por ahora creo que la forma correcta de verificar con seguridad si está conectado a una red Wi-Fi o celular es:

public static boolean isNetworkConnected() { final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); if (cm != null) { if (Build.VERSION.SDK_INT < 23) { final NetworkInfo ni = cm.getActiveNetworkInfo(); if (ni != null) { return (ni.isConnected() && (ni.getType() == ConnectivityManager.TYPE_WIFI || ni.getType() == ConnectivityManager.TYPE_MOBILE)); } } else { final Network n = cm.getActiveNetwork(); if (n != null) { final NetworkCapabilities nc = cm.getNetworkCapabilities(n); return (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)); } } } return false; }

También puede consultar otros tipos de TRANSPORT , que puede encontrar here .

Nota importante: si está conectado a Wi-Fi y a una VPN, entonces su estado actual podría ser TRANSPORT_VPN , por lo que es posible que también desee verificarlo.

No olvide agregar el siguiente permiso a su archivo AndroidManifest:

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


La respuesta aceptada es obsoleta nuevamente en 28 (Android P) , pero su método de reemplazo solo funciona en 23 (Android M) . Para admitir dispositivos más antiguos, escribí una función auxiliar.

Cómo utilizar:

int type = getConnectionType(getApplicationContext());

Devuelve un int , puede cambiarlo a enum en su código:

0: No hay Internet disponible (tal vez en modo avión o en el proceso de unirse a un wi-fi).

1: Celular (datos móviles, 3G / 4G / LTE, lo que sea).

2: wifi.

Puede copiar la versión Kotlin o Java de la función auxiliar.

Kotlin:

@IntRange(from = 0, to = 2) fun getConnectionType(context: Context): Int { var result = 0 // Returns connection type. 0: none; 1: mobile data; 2: wifi val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { cm?.run { cm.getNetworkCapabilities(cm.activeNetwork)?.run { if (hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { result = 2 } else if (hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { result = 1 } } } } else { cm?.run { cm.activeNetworkInfo?.run { if (type == ConnectivityManager.TYPE_WIFI) { result = 2 } else if (type == ConnectivityManager.TYPE_MOBILE) { result = 1 } } } } return result }

Java:

@IntRange(from = 0, to = 2) public static int getConnectionType(Context context) { int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (cm != null) { NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); if (capabilities != null) { if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { result = 2; } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { result = 1; } } } } else { if (cm != null) { NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (activeNetwork != null) { // connected to the internet if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { result = 2; } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { result = 1; } } } } return result; }


NetManager que puede usar para verificar la conexión a Internet en Android con Kotlin

Si usa minSdkVersion> = 23

class NetManager @Inject constructor(var applicationContext: Context) { val isConnectedToInternet: Boolean? get() = with( applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager ) { isConnectedToInternet() } } fun ConnectivityManager.isConnectedToInternet() = isConnected(getNetworkCapabilities(activeNetwork)) fun isConnected(networkCapabilities: NetworkCapabilities?): Boolean { return when (networkCapabilities) { null -> false else -> with(networkCapabilities) { hasTransport(TRANSPORT_CELLULAR) || hasTransport(TRANSPORT_WIFI) } } }

Si usa minSdkVersion <23

class NetManager @Inject constructor(var applicationContext: Context) { val isConnectedToInternet: Boolean? get() = with( applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager ) { isConnectedToInternet() } } fun ConnectivityManager.isConnectedToInternet(): Boolean = if (Build.VERSION.SDK_INT < 23) { isConnected(activeNetworkInfo) } else { isConnected(getNetworkCapabilities(activeNetwork)) } fun isConnected(network: NetworkInfo?): Boolean { return when (network) { null -> false else -> with(network) { isConnected && (type == TYPE_WIFI || type == TYPE_MOBILE) } } } fun isConnected(networkCapabilities: NetworkCapabilities?): Boolean { return when (networkCapabilities) { null -> false else -> with(networkCapabilities) { hasTransport(TRANSPORT_CELLULAR) || hasTransport(TRANSPORT_WIFI) } } }


Respuesta actualizada (19: 07: 2018):

Este método lo ayudará a verificar si la conexión a Internet está disponible.

public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivityManager != null) { NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); return (activeNetwork != null && activeNetwork.isConnectedOrConnecting()); } else { return false; } }

Vieja respuesta:

Para la mejor práctica de reutilización de código, improvise la respuesta de Cheese Bread.

public static boolean isNetworkAvailable(Context context) { int[] networkTypes = {ConnectivityManager.TYPE_MOBILE, ConnectivityManager.TYPE_WIFI}; try { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); for (int networkType : networkTypes) { NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); if (activeNetworkInfo != null && activeNetworkInfo.getType() == networkType) return true; } } catch (Exception e) { return false; } return false; }

El código se puede colocar en la clase Util y se puede usar para verificar si el teléfono está conectado a Internet a través de Wifi o Internet móvil desde cualquier parte de su aplicación.


public boolean isConnectedToWifi(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivityManager == null) { return false; } if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { Network network = connectivityManager.getActiveNetwork(); NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network); if (capabilities == null) { return false; } return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI); } else { NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (networkInfo == null) { return false; } return networkInfo.isConnected(); } }