este problema se puede resolver de diferentes maneras, pero te mostramos la respuesta más completa para nosotros.
Solución:
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
Actualización de febrero de 2020:
La respuesta aceptada vuelve a quedar obsoleta 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 en.
Cómo utilizar:
int type = getConnectionType(getApplicationContext());
Devuelve un int
, puedes cambiarlo a enum
en tu código:
0: No hay Internet disponible (tal vez en modo avión o en el proceso de unirse a una conexión wi-fi).
1: Celular (datos móviles, 3G / 4G / LTE lo que sea).
2: Wi-Fi.
3: VPN
Puede copiar la versión de Kotlin o Java de la función auxiliar.
Kotlin:
@IntRange(from = 0, to = 3)
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 if (hasTransport(NetworkCapabilities.TRANSPORT_VPN))
result = 3
else
cm?.run
cm.activeNetworkInfo?.run
if (type == ConnectivityManager.TYPE_WIFI)
result = 2
else if (type == ConnectivityManager.TYPE_MOBILE)
result = 1
else if(type == ConnectivityManager.TYPE_VPN)
result = 3
return result
Java:
@IntRange(from = 0, to = 3)
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 (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN))
result = 3;
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;
else if (activeNetwork.getType() == ConnectivityManager.TYPE_VPN)
result = 3;
return result;
En octubre de 2018, la respuesta aceptada está obsoleta.
getType()
, y los tipos en sí, ahora están obsoletos en el nivel de API 28. De Javadoc:
Las personas que llaman deben cambiar a la comprobación de NetworkCapabilities # hasTransport en su lugar con una de las constantes NetworkCapabilities # TRANSPORT *
Para usar NetworkCapabilities
, necesitas pasar un Network
instancia a la getNetworkCapabilities()
método. Para obtener esa instancia, debes llamar getActiveNetwork()
que se agregó en el nivel de API 23.
Entonces, creo que por ahora la forma correcta de verificar de manera segura 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)
else
final Network n = cm.getActiveNetwork();
if (n != null)
return false;
También puede buscar otros tipos de TRANSPORT
, que puede encontrar aquí.
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 desee comprobarlo también.
No olvide agregar el siguiente permiso a su archivo AndroidManifest:
Si conservas alguna suspicacia o disposición de arreglar nuestro artículo te mencionamos dejar un paráfrasis y con mucho gusto lo analizaremos.