verificando - verificar conexion android studio
Conectividad a internet con Android comprueba mejor método (10)
De acuerdo con el sitio del desarrollador de Android, Determinación y monitoreo del estado de conectividad , podemos verificar que haya una conexión activa a Internet. Pero esto no funciona si incluso solo Wi-Fi está conectado y no está disponible Internet (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 método mejor para verificar la conectividad a Internet que este para evitar el retraso en hacer ping a la dirección?
// *** Para verificar el acceso a internet
public static Boolean isOnline(){
boolean isAvailable = false;
try {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
URL url = new URL("https://.com/");
HttpURLConnection httpURLConnection = null;
httpURLConnection = (HttpURLConnection) url.openConnection();
// 2 second time out.
httpURLConnection.setConnectTimeout(2000);
httpURLConnection.connect();
if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
isAvailable = true;
} else {
isAvailable = false;
}
} catch (IOException e) {
e.printStackTrace();
isAvailable = false;
}
if (isAvailable){
return true;
}else {
return false;
}
}
Al revisar este problema, encontró que no podemos determinar si hay una conexión activa a Internet usando el método especificado en el sitio del desarrollador: https://developer.android.com/training/monitoring-device-state/connectivity-monitoring. html
Esto solo verificará si hay conexión activa de wifi.
Así que encontré 2 métodos que verifican si hay una conexión a internet activa
1. Hacer un sitio web usando 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 Google DNS 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 adapta a mis requisitos)
Gracias a todos por las respuestas y apoyo.
ConnectivityManager no podrá decirle si tiene una conexión activa en WIFI.
La única opción para comprobar si tenemos conexión a Internet activa es hacer ping a la URL. Pero no necesita hacerlo con cada solicitud HTTP que realizó desde su aplicación.
Lo que puedes hacer:
Use el código de abajo para verificar 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 mientras hace la llamada de descanso, el tiempo de espera establecido por el cliente HTTP es de 10 segundos. Si no obtiene respuesta en 10 segundos, significa que no tiene una conexión a Internet activa y se lanzará una excepción (en su mayoría, obtendrá respuesta en 10 segundos). No es necesario que compruebe la conexión activa haciendo ping cada vez (si no está haciendo una aplicación de chat o VOIP)
El primer problema que debe aclarar es a qué se refiere con whether internet is available
?
- No conectado a wifi o red celular;
- Conectado a una wifi limitada: por ejemplo, en una red escolar, si se conecta a una wifi escolar, 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 debido a que alguna intranet realizó una redirección automática a la página de inicio de sesión;
- Conectado a wifi ilimitado: eres libre de acceder a la mayoría de los sitios web;
El segundo problema es ¿qué quieres lograr?
Por lo que entiendo de su descripción, parece que desea probar la conexión de la red y recordarle al usuario si falla. Así que te recomiendo que solo hagas ping a tu servidor, lo que siempre está bien si quieres 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 de conmutación de paquetes , lo que significa que no hay una ''ruta'' fija para que se ejecuten los datos, es decir, no como un teléfono, tenemos una conexión real entre dos usuarios, podemos conocer el La conexión se pierde inmediatamente después de que se rompe el circuito. Tenemos que enviar un paquete al destino, y no encontrar respuesta, entonces sabemos que perdemos la conexión (que es lo que hace ping, el protocolo ICMP).
En conclusión, no tenemos una mejor manera de probar la conectividad a un host que no sea hacer ping, por eso se usa el latido en la administración de servicios.
Intente 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 olvides el acceso:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Más:
if (InetAddress.getByName("www.google.com").isReachable(timeout))
{ }
else
{ }
Prueba este método, esto te 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;
}
Prueba esto:
Es realmente simple 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; }
}
Entonces, donde quiera que quiera verificar solo use esto:
if (isInternetAvailable("8.8.8.8", 53, 1000)) {
// Internet available, do something
} else {
// Internet not available
}
Puedes 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 tu actividad llamas a esta función así.
if(YourClass.isOnline(context))
{
// Do your stuff here.
}
else
{
// Show alert, no Internet connection.
}
No te olvides de agregar ACCESS_NETWORK_STATE PERMISSION:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Intenta esto si solo quieres 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;
}
Quería comentar, pero no tengo suficiente reputación: /
De todos modos, un problema con la respuesta aceptada es que no detecta una excepción SocketTimeoutException, que he visto en la naturaleza (Android) que causa bloqueos.
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;
} catch (SocketTimeoutException e) {
return false;
}
}
Tal vez esto pueda 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;
}
}