Android SDK: ¿Cómo detecto la conexión a Internet?

Si tu aplicación necesita conectarse a Internet resulta muy útil comprobar si disponemos de dicha conexión. Lo primero que vamos a añadir son los permisos al AndroidManifest.xml para que nuestro usuario disponga de dichos permisos. Sí, en realidad la aplicación se ejecuta en el sistema operativo y actúa como usuario UNIX a nivel de permisos. Vamos a ver el Manifest:

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

Necesitamos el acceso a Internet genérico y saber el estado de la red. En nuestra clase Java vamos a poner una función de verificación de la conexión, es muy sencilo:

	public static boolean verificaConexion(Context ctx) {
		boolean bConectado = false;
		ConnectivityManager connec = (ConnectivityManager) ctx
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		// No sólo wifi, también GPRS
		NetworkInfo[] redes = connec.getAllNetworkInfo();
		// este bucle debería no ser tan ñapa
		for (int i = 0; i < 2; i++) {
			// ¿Tenemos conexión? ponemos a true
			if (redes[i].getState() == NetworkInfo.State.CONNECTED) {
				bConectado = true;
			}
		}
		return bConectado;
	}

Ahora que tenemos el método, vamos a usarlo en la parte que nos interese comprobar el estado de la conexión, típicamente puede ser inmediatamente después del  super.onCreate(savedInstanceState); en nuestro onCreate. Si no es TRUE que tengamos conexión, lanzamos un Toast o mensajito por pantalla y salimos de la aplicación :

		if (!verificaConexion(this)) {
			Toast.makeText(getBaseContext(),
					"Comprueba tu conexión a Internet. Saliendo ... ", Toast.LENGTH_SHORT)
					.show();
			this.finish();
		}

Hacemos todo esto porque si nuestra aplicación necesita conexión y no lo comprobamos ésta lanza una excepción y sale a las bravas, sin despedirse ni nada. Un FAIL en toda regla de programador.
Hasta la próxima !



24 comentarios

  1. matias

    Hola el método funciona, en estos momentos lo estoy asignado a un botón enviar, pero como puedo hacer para que este siempre buscando si hay conexión.

    Ejemplo de esto WhatsApp el cual esta siempre escuchando cuando hay conexión a Internet para poder enviar el mensaje, en segundo plano

    ojalá me puedan ayudar

  2. Cristopher

    No sirve, el método getAllNetworkInfo esta deprecado, alguien sabe una solución más actual ?

    • Amigo hasta en la versión 5.0 de android funciona, te lo digo porque yo lo uso en una app que desarrolle.

      Valida que estés importando las librerías:

      import android.content.Context;
      import android.net.ConnectivityManager;
      import android.net.NetworkInfo;

  3. Juan carlos

    alguien sabe como puedo visualizar a que red wifi esta conectado y/0 poder acceder a las redes para cambiarla?

    saludos!

  4. Arnold Charris

    El codigo funciona perfectamente para detectar que el WIFI y los datos se encuentran deshabilitados, pero en realidad no valida que por ejemplo a pesar de que tenga los datos habilitados no tengo recursos de internet osea plan de datos. No se que podria adicionarle para que me valide que no tengo plan de datos o recursos.

    • Pues valide o contabilice el tempo que dura en resibir la peticion.
      en realidad las grandes aplicaciones como youtube whatsApp hacen eso
      y ps es muy facil

  5. Jorge Alexander Valencia Valencia

    Muchas gracias lo necesito pues mi apk accede a Internet pero sólo por WiFi con este código puedo hacer que acceda si el dispositivo tiene red de datos? Lo probaré pero si me puedo comunicar con Ud sería de gran ayuda

  6. Danny

    Hola no soy un experto en programación Android pero me parece que la función solo verifica si esta activado el trafico de datos y no así si tiene acceso a internet podría estar activado el trafico pero sin acceso a internet, pasa lo mismo con la conexión a wifí podría estar en una red pero sin conexión a internet, no se si me deje entender no digo que este mal la función, solo esa observación.

    • Mauricio

      Hola Danny:
      Tengo ese problema, ya que realmente quiero saber si tengo salida a internet.
      Has logrado hacer esa validación???

  7. Emiliano

    Excelente! solo un pequeño detalle, Seria prudente modificar la siguiente linea!

    for (int i = 0; i < 2; i++) {…

    por:

    for (int i = 0; i < redes.length; i++) {

Deja una respuesta

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