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?
- ¿Android N no está enviando android.net.conn.CONNECTIVITY_CHANGE?
- OnCreateOptionsMenu no recibe llamadas en Android 7.0
- Aplicación que no instala algún dispositivo Android Android N android
- Doze, diferente entre Marshmallow y Nougat
- 'La aplicación está escaneando con demasiada frecuencia' con ScanSettings.SCAN_MODE_OPPORTUNISTIC
- Deshabilitar la función de ventanas múltiples para Android N no funciona para una actividad
- Faltan los extras de Android 7
- Android.os.TransactionTooLargeException en Nougat
- Maneje los cambios de red en android 7 Turrón
- Cómo ocultar la fecha en el selector de fecha
- No se puede encontrar ColorStateList de ID de recurso extraíble sólo en Android Nougat
- ¿Cuál es el significado de E / OpenGLRenderer: saveGfxinfoFileDisabled - habilitado mostrando demasiadas veces en los registros
- Botones que faltan en AlertDialog | Android 7.0 (Nexus 5x)
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:
-
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; } }
-
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)
- Obtención de información de encabezado con RXJava y Retrofit
- ¿Cómo puedo distribuir la aplicación de Android al probador beta sin usar Market