java - validar - verificar estado de conexión a internet en tu aplicación android
¿Cómo verificar mediante programación la disponibilidad de conexión a internet en Android? (7)
Quiero verificar mediante programación si hay una conexión a Internet en el teléfono / emulador de Android. Entonces, una vez que esté seguro de que hay una conexión a Internet, haré una llamada a Internet.
Así que es como "¡Hola emulador! Si tienes una conexión a Internet, abre esta página, de lo contrario, doSomeThingElse ();"
De mi vieja respuesta aquí
Solo prueba esto
He aplicado la solución provista por @Levit y he creado una función que no llamará a la Solicitud Http extra.
Se solucionará 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 llamalo como
if (!isInternetAvailable(getActivity())) {
//Show message
} else {
//Perfoem the api request
}
Debido a que usted está conectado a una red no garantiza que tenga Internet, solo he hecho mis llamadas a Internet dentro de un bloque de captura de prueba. A continuación, capture la excepción UnknownHostException para no manejar Internet.
El método que implementé para 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;
}
}
Tenga en cuenta que esto es un NetworkConnection-Check. Si hay una NetworkConnection, no tiene que ser una conexión a Internet.
En cuanto al título de la pregunta, desea comprobar el acceso a internet.
Así que la forma más rápida y eficiente al menos por ahora,
gracias a levit basado en su respuesta https://.com/a/27312494/3818437
Si solo desea verificar una conexión a cualquier red, sin importar si Internet está disponible, entonces la mayoría de las respuestas aquí (incluida la aceptada), la implementación de isConnectedOrConnecting () funcionará bien. Si desea saber si tiene una conexión a Internet (como lo indica el título de la pregunta), lea en Ping los servidores de nombres principales.
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! Sí, tan breve, sí, es rápido, no, no es necesario que se ejecute en segundo plano, no, no necesita privilegios de root.
Posibles preguntas
¿Es esto lo suficientemente rápido?
Sí, muy rápido!
¿Realmente no hay una forma confiable de verificar si Internet está disponible, aparte de probar algo en Internet?
No lo que sé, pero házmelo saber y editaré mi respuesta.
¿No podría simplemente hacer ping a mi propia página, que quiero solicitar de todos modos?
¡Por supuesto! Incluso puede marcar ambos, si desea diferenciar entre "conexión a internet disponible" y que sus propios servidores sean accesibles
¿Qué pasa si el DNS está fuera de servicio?
El DNS de Google (por ejemplo, 8.8.8.8) es el servicio de DNS público más grande del mundo. A partir de 2013 atiende 130 mil millones de solicitudes al día. Digamos que tu aplicación que no responde probablemente no será la conversación del día.
¿Qué permisos se requieren?
Solo acceso a Internet: qué sorpresa ^^ (¿Por cierto, alguna vez has pensado en cómo algunos de los métodos sugeridos aquí podrían incluso tener un vínculo remoto sobre la disponibilidad de Internet, sin este permiso?)
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, puede estar en un restaurante, donde puede estar conectado a la wifi, pero aún necesita una contraseña para el punto de acceso para usar Internet. En tales casos, los métodos anteriores se volverán verdaderos, sin embargo, el dispositivo no tendrá Internet, y si no está rodeado por el intento correcto, 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 puede conectarse a otro host y ambos pueden hacer una conexión.
A continuación se muestra un método que puede verificar si el dispositivo puede conectarse a un sitio web y devolver una respuesta en consecuencia.
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
}
He estado usando estos dos métodos para verificar el estado de Internet. Algunas veces el protocolo https no funciona. Pruebe el protocolo http.
// 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;
}
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");
}