Comprobación de la conectividad a Internet con Android mejor método

Según el sitio de desarrolladores de Android, Determinar y supervisar el estado de conectividad , podemos comprobar que hay una conexión a Internet activa. Pero esto no funciona si sólo Wi-Fi está conectado y no Internet disponible (notifica que hay una conexión a Internet).

Ahora hago ping a un sitio web y compruebo si las conexiones a Internet están disponibles o no. Y este método necesita un poco más de tiempo de procesamiento. ¿Existe un mejor método para comprobar la conectividad a Internet que esto para evitar el retraso en el ping de la dirección?

Prueba esto:

Es muy sencillo y rápido:

public boolean isInternetAvailable(String address, int port, int timeoutMs) { try { Socket sock = new Socket(); SocketAddress sockaddr = new InetSocketAddress(address, port); sock.connect(sockaddr, timeoutMs); // This will block no more than timeoutMs sock.close(); return true; } catch (IOException e) { return false; } } 

A continuación, donde quiera comprobar sólo tiene que utilizar esto:

 if (isInternetAvailable("8.8.8.8", 53, 1000)) { // Internet available, do something } else { // Internet not available } 

El primer problema que debes aclarar es qué quieres decir con whether internet is available ?

  • No conectado a red wifi o celular;
  • Conectado a un wifi limitado: por ejemplo, en una red escolar, si se conecta al wifi de la escuela, puede acceder a la intranet directamente. Pero tienes que iniciar sesión con la cuenta de la escuela para acceder a la extranet. En este caso, si hace ping a un sitio web de extranet, puede recibir una respuesta porque alguna intranet ha hecho redireccionamiento automático a la página de inicio de sesión;
  • Conectado al wifi ilimitado: usted es libre de tener acceso a la mayoría de los Web site;

El segundo problema es ¿qué quieres lograr?

Por lo que entiendo su descripción, parece que desea probar la conexión de la red y recordar al usuario si falla. Por lo tanto, le recomiendo que sólo haga ping a su servidor, que siempre está bien si desea intercambiar datos con él.


Usted se pregunta si hay una mejor manera de probar la conectividad, y la respuesta es no.

La red TCP / IP actual es un circuito virtual, una red conmutada por paquetes , lo que significa que no hay una "ruta" fija para que los datos se ejecuten, es decir, no como un teléfono, tenemos una conexión real entre dos usuarios, podemos conocer la la conexión se pierde inmediatamente después de que se rompa el circuito. Tenemos que enviar un paquete al destino, y no encontrar ninguna respuesta, entonces sabemos, perdemos la conexión (que es lo que ping – protocolo ICMP – hace).

En conclusión, no tenemos mejor manera de probar la conectividad a un host que no sea ping, por eso la pulsación del corazón se utiliza en la administración de servicios.

Pruebe lo siguiente:

 public boolean checkOnlineState() { ConnectivityManager CManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo NInfo = CManager.getActiveNetworkInfo(); if (NInfo != null && NInfo.isConnectedOrConnecting()) { return true; } return false; } 

No olvide el acceso:

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

Más:

 if (InetAddress.getByName("www.google.com").isReachable(timeout)) { } else { } 

Tal vez esto puede ayudarle:

 private boolean checkInternetConnection() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // Test for connection if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isAvailable() && cm.getActiveNetworkInfo().isConnected()) { return true; } else { return false; } } 

Al comprobar este problema, encontró que no podemos determinar si hay una conexión a Internet activa, utilizando el método especificado en el sitio del desarrollador: https://developer.android.com/training/monitoring-device-state/connectivity-monitoring. html

Esto sólo comprobará si hay conexión activa de wifi.

Así que encontré 2 métodos que verifican si hay una conexión a Internet activa

1.Ping un sitio web utilizando el método de abajo

 URL url = new URL(myUrl); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); // 30 second time out. httpURLConnection.setConnectTimeout(30000); httpURLConnection.connect(); if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { isAvailable = true; } 

2.Compruebe la disponibilidad de DNS de Google usando socket

  try { Socket sock = new Socket(); SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53); sock.connect(sockaddr, 1000); // this will block no more than timeoutMs sock.close(); return true; } 

El segundo método es poco más rápido que el segundo método (que se adapte a mi requisito)

Gracias a todos por las respuestas y el apoyo.

Pruebe este método, esto le ayudará a:

 public static boolean isNetworkConnected(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivityManager != null) { NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo(); if (netInfo != null && netInfo.isConnected()) { return true; } } return false; } 

Puede probar esto para comprobar la conectividad a Internet:

 /** * Check Connectivity of network. */ public static boolean isOnline(Context context) { try { if (context == null) return false; ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (cm != null) { if (cm.getActiveNetworkInfo() != null) { return cm.getActiveNetworkInfo().isConnected(); } else { return false; } } else { return false; } } catch (Exception e) { Log.error("Exception", e); return false; } } 

En su actividad usted llama esta función como esto.

 if(YourClass.isOnline(context)) { // Do your stuff here. } else { // Show alert, no Internet connection. } 

No olvide agregar ACCESS_NETWORK_STATE PERMISSION:

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

Pruebe esto si desea hacer ping a la URL:

 public static boolean isPingAvailable(String myUrl) { boolean isAvailable = false; try { URL url = new URL(myUrl); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); // 30 second time out. httpURLConnection.setConnectTimeout(30000); httpURLConnection.connect(); if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { isAvailable = true; } } catch (Exception e) { isAvailable = false; e.printStackTrace(); } return isAvailable; } 

ConnectivityManager no podrá decirle si tiene conexión activa en WIFI.

La única opción para comprobar si tenemos conexión a Internet activa es hacer ping a la dirección URL. Pero no necesitas hacer eso con cada solicitud HTTP que hayas hecho desde tu aplicación.

Lo que puedes hacer:

  1. Utilice debajo del código para comprobar la conectividad

     private boolean checkInternetConnection() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // test for connection if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isAvailable() && cm.getActiveNetworkInfo().isConnected()) { return true; } else { return false; } } 
  2. Y al hacer la llamada de descanso utilizando el tiempo de espera del cliente HTTP como 10 segundos. Si no obtienes respuesta en 10 segundos significa que no tienes conexión a Internet activa y se lanzará una excepción (sobre todo obtienes respuesta en 10 segundos). No es necesario comprobar la conexión activa haciendo ping cada vez (si no está haciendo Chat o aplicación VOIP)

  • Excepción de puntero nulo en la ventana de sugerencias popup en Samsung Galaxy Android 7
  • Cómo diseñar una página que soporte Android N (turrón) API 24 (diseño de ventanas múltiples)?
  • No se ejecuta el Programador de trabajos en Android N
  • Android Speech Recognition API no funciona en Android 7 Nougat
  • Notification.bigContentView está obsoleto en API 24 (Nougat) ¿cuál es la alternativa?
  • Acepta programáticamente la llamada en Nougat
  • Android 7.0 scan sin resultados
  • Android ClipPath de Nougat no funciona durante la animación
  • Detectar la aplicación actual en Android Nougat 7. + versión
  • Detectar cambios de conectividad en Android 7.0 Nougat cuando la aplicación está en primer plano
  • Android toolchain jack no reconoce java.util.function.Predicate en secuencia
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.