18

Quiero comprobar programáticamente si hay una conexión a Internet en el teléfono Android/emulador. Entonces, una vez que estoy seguro de que hay una conexión a Internet, haré una llamada a Internet.¿Cómo comprobar programáticamente la disponibilidad de la conexión a Internet en Android?

Así que es como "Hola emulador! Si tienes una conexión a Internet, abre esta página, sino doSomeThingElse();"

Espero que te hagas una idea. Agradecería mucho una respuesta rápida. Lo necesito bastante temprano.

Respuesta

2

Prueba esto:

ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 

if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING ) { 
    text.setText("hey your online!!!")  ;    
    //Do something in here when we are connected 
} else if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED ) { 
    text.setText("Look your not online");   
} 
25

El método que he implementado por mí mismo:

/* 
* isOnline - Check if there is a NetworkConnection 
* @return boolean 
*/ 
protected boolean isOnline() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.isConnected()) { 
     return true; 
    } else { 
     return false; 
    } 
} 

ser conscientes de que este es un NetworkConnection-Check. Si hay una conexión de red, no tiene que ser una conexión de Internet.

+0

código de retorno se puede simplificar a: 'volver NETINFO = null && netInfo.isConnected();! ' –

0

Como estar conectado a una red no garantiza que tenga internet, he ido simplemente a hacer mis llamadas a internet dentro de un bloque try catch. Luego tome la excepción UnknownHostException para no manejar internet.

11

Estar conectado a una red no garantiza la conectividad a Internet.

Es posible que esté conectado al wifi de su casa, pero es posible que no tenga conexión a Internet. O bien, es posible que se encuentre en un restaurante, donde puede conectarse a la red wifi, pero aún necesita una contraseña para el punto de acceso para usar Internet. En tales casos, los métodos anteriores volverán a ser ciertos, pero el dispositivo no tendrá conexión a Internet, y si no está rodeado de las capturas e intentos correctos, la aplicación podría fallar.

En pocas palabras, la conectividad de red no significa conectividad a Internet, simplemente significa que el hardware inalámbrico de su dispositivo se puede conectar a otro host y ambos pueden establecer una conexión.

A continuación se muestra un método que puede verificar si el dispositivo se puede conectar a un sitio web y responde como corresponde.

if (networkConnectivity()) 
{ 
    try 
    { 
     HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.anywebsiteyouthinkwillnotbedown.com").openConnection()); 
     urlc.setRequestProperty("User-Agent", "Test"); 
     urlc.setRequestProperty("Connection", "close"); 
     urlc.setConnectTimeout(3000); //choose your own timeframe 
     urlc.setReadTimeout(4000); //choose your own timeframe 
     urlc.connect(); 
     networkcode2 = urlc.getResponseCode(); 
     return (urlc.getResponseCode() == 200); 
    } catch (IOException e) 
    { 
     return (false); //connectivity exists, but no internet. 
    } 
} else 
{ 
    return false; //no connectivity 
} 
+0

¿Puedes dar explicaciones sobre tu código? ¿Por qué configuras esas propiedades de solicitud? ¿Es esta una forma adecuada de verificar la conectividad a Internet para conexiones muy lentas/débiles, que minimizan la transferencia de datos para verificar la disponibilidad de la conexión? – remi

+0

@remi. debería funcionar bien no puedo ver una razón para no hacerlo. no lo han probado en conexiones muy lentas aunque. – tony9099

+0

Funciona, pero existe el riesgo de suspender la solicitud de DNS en esta solución. El dispositivo intentará resolver la dirección web y es posible que no llegue al servidor DNS. –

5

como para el título de la pregunta, desea comprobar el acceso a internet,

por lo que la forma más rápida y es eficaz al menos por ahora,

thnx a levit basado en su respuesta https://stackoverflow.com/a/27312494/3818437

Si solo desea comprobar la conexión a cualquier red (sin importar si hay internet disponible), la mayor parte del swers aquí (incluyendo aceptado), implementar isConnectedOrConnecting() funcionará bien. Si desea saber si usted tiene una conexión a Internet (como el título indica pregunta) lea sobre el Ping para el nombre principal servidores

public boolean isOnline() { 

    Runtime runtime = Runtime.getRuntime(); 
    try { 

     Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); 
     int  exitValue = ipProcess.waitFor(); 
     return (exitValue == 0); 

    } catch (IOException e)   { e.printStackTrace(); } 
     catch (InterruptedException e) { e.printStackTrace(); } 

    return false; } 

Eso es todo! Sí, en resumen, sí, es rápido, no, no necesita ejecutarse en segundo plano, no, no necesita privilegios de root.

Preguntas Posibles

¿Es esto realmente lo suficientemente rápido?

Sí, muy rápido!

¿Realmente no hay una forma confiable de verificar si hay disponibilidad de internet, , aparte de probar algo en internet?

No sé, pero hágamelo saber, y voy a editar mi respuesta.

¿No podría simplemente hacer ping a mi propia página, que deseo solicitar de todos modos?

Sure! Incluso puede verificar ambos, si desea diferenciar entre "conexión a internet disponible" y sus propios servidores son accesibles

¿Qué sucede si el DNS está inactivo?

Google DNS (por ejemplo, 8.8.8.8) es el servicio DNS público más grande del mundo . A partir de 2013 atiende 130 mil millones de solicitudes por día. Solo digamos decir, su aplicación no responde probablemente no sea la comidilla del día .

¿Qué permisos son requeridos?

Sólo acceso a Internet - lo que la sorpresa ^^ (? Por cierto ¿alguna vez has pensado, cómo algunos de los métodos sugeridos aquí, incluso podría tener una cola remota sobre la availablility de Internet, sin este permiso)

3

he estado usando estos dos métodos para comprobar el estado de Internet veces https protocolo no funciona tratar http protocolo

// Check if network is available 
public static boolean isNetworkAvailable() { 
    ConnectivityManager cm = (ConnectivityManager) 
      AppGlobals.getContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
    return networkInfo != null && networkInfo.isConnected(); 
} 

// ping the google server to check if internet is really working or not 
public static boolean isInternetWorking() { 
    boolean success = false; 
    try { 
     URL url = new URL("https://google.com"); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setConnectTimeout(10000); 
     connection.connect(); 
     success = connection.getResponseCode() == 200; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return success; 
} 
0

Desde mi OLD Answer here

Intenta esto

he aplicado la solución aportada por @Levit y función que no va a llamar a la petición HTTP adicional creado.

Se va a resolver el error Unable to Resolve Host

public static boolean isInternetAvailable(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    if (activeNetwork == null) return false; 

    switch (activeNetwork.getType()) { 
     case ConnectivityManager.TYPE_WIFI: 
      if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED || 
        activeNetwork.getState() == NetworkInfo.State.CONNECTING) && 
        isInternet()) 
       return true; 
      break; 
     case ConnectivityManager.TYPE_MOBILE: 
      if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED || 
        activeNetwork.getState() == NetworkInfo.State.CONNECTING) && 
        isInternet()) 
       return true; 
      break; 
     default: 
      return false; 
    } 
    return false; 
} 

private static boolean isInternet() { 

    Runtime runtime = Runtime.getRuntime(); 
    try { 
     Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); 
     int exitValue = ipProcess.waitFor(); 
     Debug.i(exitValue + ""); 
     return (exitValue == 0); 
    } catch (IOException | InterruptedException e) { 
     e.printStackTrace(); 
    } 

    return false; 
} 

Ahora llamar así,

if (!isInternetAvailable(getActivity())) { 
    //Show message 
} else { 
    //Perfoem the api request 
} 
+0

Pruebo en un dispositivo Android y este código sobresale – Ricardo

+0

¿Qué es "/ system/bin/ping -c 1 8.8.8.8"? – TheLearner

Cuestiones relacionadas