Detectar si hay una conexión a Internet disponible en Android

Necesito detectar si el dispositivo Android está conectado a Internet.

La clase NetworkInfo proporciona un método no estático isAvailable() que suena perfecto.

El problema es que:

NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
    // do something
}

arroja este error:

idioma: lang-none -->

The constructor NetworkInfo is not visible.

Seguro que hay otra clase que devuelve un objeto NetworkInfo. Pero no sé cuál.

  1. ¿Cómo conseguir que el fragmento de código anterior funcione?
  2. ¿Cómo he podido encontrar yo mismo la información que necesitaba en la documentación en línea?
  3. ¿Puede sugerir una forma mejor para este tipo de detección?
Solución

El método getActiveNetworkInfo() de ConnectivityManager devuelve una instancia NetworkInfo que representa la primera interfaz de red conectada que puede encontrar o null si ninguna de las interfaces está conectada. Comprobar si este método devuelve null debería ser suficiente para saber si hay una conexión a Internet disponible o no.

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

También necesitarás:

en el manifiesto de tu androide.

Editar:

Ten en cuenta que tener una interfaz de red activa no garantiza que un determinado servicio en red esté disponible. Los problemas de red, el tiempo de inactividad del servidor, la baja señal, los portales cautivos, los filtros de contenido y similares pueden impedir que tu aplicación llegue a un servidor. Por ejemplo, no puedes saber con seguridad si tu aplicación puede llegar a Twitter hasta que recibas una respuesta válida del servicio de Twitter.

Comentarios (28)

También otra nota importante. Tienes que establecer android.permission.ACCESS_NETWORK_STATE en tu AndroidManifest.xml para que esto funcione.

_ ¿cómo he podido encontrar yo mismo la información que necesitaba en la documentación online?

Sólo tienes que leer bien la documentación de las clases y encontrarás todas las respuestas que buscas. Mira la documentación de ConnectivityManager. La descripción te dice lo que tienes que hacer.

Comentarios (3)

Probablemente me he encontrado a mí mismo:

ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();
Comentarios (5)