2012-07-30 16 views
5

Tengo un código para determinar si hay una conexión de red o no:detectar si no hay conexión a Internet

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 

    if (netInfo != null && netInfo.isConnected()) 
    { 
     // There is an internet connection 
    } 

Pero si hay una conexión de red y no hay internet esto es inútil. Tengo que hacer ping a un sitio web y esperar una respuesta o tiempo de espera para determinar la conexión a Internet:

URL sourceUrl; 
    try { 
     sourceUrl = new URL("http://www.google.com"); 
     URLConnection Connection = sourceUrl.openConnection(); 
     Connection.setConnectTimeout(500); 
     Connection.connect(); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 

     // no Internet 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 

     // no Internet 
    } 

pero es una detección lenta. Debo aprender una forma buena y rápida de detectarlo.

Gracias de antemano.

+0

Significa que también usa WIFI. ¿Estoy en lo cierto? –

+0

Sí, solo uso wifi. –

+0

Entonces, ¿cuál es el problema? –

Respuesta

2

Try siguiente método para detectar diferentes tipos de conexión:

private boolean haveNetworkConnection(Context context) 
{ 
    boolean haveConnectedWifi = false; 
    boolean haveConnectedMobile = false; 

    ConnectivityManager cm = (ConnectivityManager) Your_Activity_Name.this.getSystemService(Context.CONNECTIVITY_SERVICE); 
    // or if function is out side of your Activity then you need context of your Activity 
    // and code will be as following 
    // (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 
    for (NetworkInfo ni : netInfo) 
    { 
     if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
     { 
      if (ni.isConnected()) 
      { 
       haveConnectedWifi = true; 
       System.out.println("WIFI CONNECTION AVAILABLE"); 
      } else 
      { 
       System.out.println("WIFI CONNECTION NOT AVAILABLE"); 
      } 
     } 
     if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
     { 
      if (ni.isConnected()) 
      { 
       haveConnectedMobile = true; 
       System.out.println("MOBILE INTERNET CONNECTION AVAILABLE"); 
      } else 
      { 
       System.out.println("MOBILE INTERNET CONNECTION NOT AVAILABLE"); 
      } 
     } 
    } 
    return haveConnectedWifi || haveConnectedMobile; 
} 
+0

Gracias Chintan por su consejo. –

+0

¿Querías esto? –

+0

no realmente. Creo que Sanjay consiguió lo que quiero. –

1

El problema con todos estos esquemas es que 'internet' no existe como una entidad. Existe una razón por la cual los intentos fallidos de conexión se informan como 'inalcanzables' o 'no se pueden conectar al servidor en blahblah'. Ejemplos:

1) No tiene señal. ¿Estás conectado a internet? ¿PING tendrá éxito? ¿Puedes conectarte a tu servidor de destino?

2) Tiene una señal, pero se ha excedido el margen de datos de su proveedor. ¿Estás conectado a internet? ¿PING tendrá éxito? ¿Puedes conectarte a tu servidor de destino?

3) Su conexión de proveedor está bien, pero su enrutador de red troncal está caído. ¿Estás conectado a internet? ¿PING tendrá éxito? ¿Puedes conectarte a tu servidor de destino?

4) Su conexión de proveedor está bien, su enrutador de red troncal está activo pero la conexión de fibra al país X donde el servidor ha sido interrumpido por un capitán ebrio y el ancla de su barco. ¿Estás conectado a internet? ¿PING tendrá éxito? ¿Puedes conectarte a tu servidor de destino?

5) Todos los enlaces al país de destino están activos, pero Fred, con su JCB de excavación de zanjas, ha cortado el cable de alimentación de la granja de servidores. Uno de los otros trabajos de Fred es dar servicio al generador de respaldo :(¿Está conectado a internet? ¿PING tendrá éxito? ¿Puede conectarse a su servidor de destino?

6) Todo el hardware está activo, pero el código del servidor fue escrito por Fred antes de ser degradado a excavador de zanjas por incompetencia y ahora se ha estrellado, de nuevo. ¿Estás conectado a internet? ¿PING tendrá éxito? ¿Puedes conectarte a tu servidor de destino?

7) Fred ha tenido un día libre, pero su administrador de servidor competente de reemplazo ha bloqueado el ping ICMP en los enrutadores para evitar ataques de DOS de ping. ¿Estás conectado a internet? ¿PING tendrá éxito? ¿Puedes conectarte a tu servidor de destino?

Por lo tanto, la única manera de estar seguro es tratar de conectarse al servidor de destino y ver qué pasa.

Seguramente puede detectar algunos casos negativos más rápidamente - seguramente si no hay señal, no puede obtener una conexión :) Pasado, simplemente debe tratar de conectarse. Informe al usuario lo que está sucediendo, use un tiempo de espera y proporcione al usuario un botón de "Cancelar". Eso es lo mejor que puedes hacer.

+0

Martin gracias por su asesoramiento. –

1

¿Qué tal esto?

Asegúrese de que tiene una conexión Wi-Fi activa, ahora utilizan WifiManager.getConnectionInfo() que devuelve información dinámica acerca de la conexión Wi-Fi actual, WifiInfo, puede obtener WifiInfo.getLinkSpeed(), que le da la velocidad del enlace actual y comparar esa información con un cierto valor mínimo.

+1

y Sanjay. Su solución a este problema es muy lógica, pero necesita un poco de valores umbral experimentales; por ejemplo, para la falta de conexión a Internet, da la velocidad del enlace 11 y si hay una conexión a Internet da 54. No estoy seguro si funcionará para todas las redes en el mundo. –

+0

Cuando probé con un módem diferente, creo que no es la solución también. –

+0

@CodersParadise Esa fue una solución experimental :-) Nunca lo intenté yo mismo. – COD3BOY

Cuestiones relacionadas