2012-09-15 19 views
5

Este código siempre devuelve verdadero. Se llama cuando se presiona un botón de inicio de sesión. Primero probé con wifi conectado (en emulador). Volvió verdadero y luego desconecté el wifi y luego lo intenté. todavía vuelve verdadero.La información de red de Android siempre devuelve verdadero incluso si Internet no está disponible

public static boolean isNetworkAvailable(Context context) { 

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
      // if no network is available networkInfo will be null 
      // otherwise check if we are connected 
      if (networkInfo != null && networkInfo.isConnected()) { 
       State network = networkInfo.getState(); 
       Log.d("here", "true"); 
       return (network == NetworkInfo.State.CONNECTED || network == NetworkInfo.State.CONNECTING); 

      } 
      Log.d("here1", "false"); 
      return false; 
} 

Respuesta

14

Este código funciona en el dispositivo, ya que estoy usando algo muy similar en una de mis aplicaciones. Tenga en cuenta que este código le dirá si está conectado a una red, no si la red a la que está conectado tiene conectividad a Internet. Si está utilizando el emulador, siempre está conectado a través de simulación 3G, por lo que desconectar el wifi de su computadora no cambiará eso. Podrías poner el emulador en modo avión, lo que debería darte el "falso" que estabas buscando.

Lo que he hecho en mis aplicaciones es crear un servicio que recibe transmisiones de cambio de red. Una vez que se conecta una red, intenta descargar un archivo conocido (pequeño) a través de Internet. Solo si tiene éxito, emitirá un intento disponible en Internet para todas las actividades, que luego puede cambiar el estado en función de esto.

+0

Entonces, ¿no hay una manera directa de saber si Internet está disponible o no? –

+0

No hay. El problema es que la "red" es una cuestión de definición aquí. Puede conectarse a wifi, con acceso completo a una intranet, y eso podría estar bien para su aplicación. También puede sentarse detrás de un firewall muy restrictivo, bloqueando, por ejemplo, www.facebook.com para mantener la productividad de los empleados. Deberá realizar una comprobación explícita del servicio que le interesa o una URL común. My ConnectivityService no es ciencia de cohetes, y lo limpiaré y lo publicaré aquí cuando disponga de un poco de tiempo, probablemente no antes del lunes. – 323go

+1

excelente respuesta discúlpeme si cito su respuesta cuando corresponda porque me volvía loco +1 – shareef

Cuestiones relacionadas