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 !

No hay contenido relacionado



23 thoughts on “Android SDK: ¿Cómo detecto la conexión a Internet?

  1. 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

    1. 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;

  2. 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.

  3. 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

    1. Hola… yo te puedo ayudar a hacer eso, identificar si estás conectado por Datos o por Wi-Fi… si gustas mandame un correo.
      Saludos.

  4. 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.

  5. 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 un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *