ANDROID: si WiFi está habilitado Y activo, inicia una intención

Esto es lo que me gustaría hacer:

=> SI WiFi está habilitado Y activo, inicia una intención (de hecho es un WebView que recibe su contenido => las instrucciones de mi aplicación en la web)

=> SI NO, entonces lanzaría otra intención de modo que no muestre un WebView con "la página Web no disponible … La página Web en http://www.mywebsite.com podría estar temporalmente abajo o puede tener movido …"

Primero he usado

if (wifi.isWifiEnabled ())

pero eso no dice si la conexión Wifi es ACTIVO o no. Sólo dice que el usuario ha encendido el interruptor. El dispositivo puede o no estar conectado … ¿Es correcto?

Entonces intenté usar:

if (wifi.getConnectionInfo (). getSSID ()! = null)

pero me di cuenta de que devuelve una cadena incluso si la conexión se ha perdido o se ha deshabilitado …?

¿Cómo debo hacer entonces?

wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); Intent intent_instructions; if (wifi.getConnectionInfo().getSSID()!= null){ Log.i("Hub", "WiFi is enabled AND active !"); Log.i("Hub", "SSID = "+wifi.getConnectionInfo().getSSID()); intent_instructions = new Intent(this, Instructions.class); }else{ Log.i("Hub", "NO WiFi"); intent_instructions = new Intent(this, Instructions_No_WiFi.class); } this.startActivity(intent_instructions); 

¿Existe una manera más general de probar si el dispositivo tiene la conectividad a Internet justo antes de lanzar una intención? ya sea a través de Wifi, 3G, etc …

Gracias de antemano por tu ayuda.

Puede utilizar el código siguiente para comprobar la conectividad:

 private static boolean isConnected(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = null; if (connectivityManager != null) { networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); } return networkInfo == null ? false : networkInfo.isConnected(); } 

Asegúrate de haber registrado la intención de android.net.conn.CONNECTIVITY_CHANGE en tu Manifiesto, o de lo contrario, nunca recibirás una notificación de que estás en línea.

He estado luchando con este problema durante los últimos días y ahora me di cuenta de que necesitaba registrar CONNECTIVITY_CHANGE y no solo WIFI_STATE_CHANGED.

Pruebe android.net.ConnectivityManager.getActiveNetworkInfo() : si devuelve null no tiene conexión; si devuelve un objeto NetworkInfo , puede comprobar el estado de la conexión con NetworkInfo.getState() , y si es NetworkInfo.State.CONNECTED entonces estás conectado, de lo contrario no lo eres.

Puede hacerlo de la siguiente manera:

  @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)){ Log.d("WIFI", "WIFI has changed"); int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1); Log.d("WIFI", "WIFI State = " + wifiState); setCurrentWifiState(wifiState); } 

Obtendrá 0,1,2,3 dependiendo de qué estado está el Wifi, por lo que por ejemplo 2 se está conectando, puede comprobar el resto en los documentos

En su clase BroadcastReceiver:

 @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)){ boolean connected = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false); if (connected){ // start your service here } } } 

Y en tu AndroidManifest.xml asegúrate de registrarte para la intención de difusión de android.net.wifi.supplicant.CONNECTION_CHANGE.

 <intent-filter > <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" /> </intent-filter> 

isConnected() no funciona bien, investiga algo más

 final ConnectivityManager connMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if( wifi.isAvailable() && wifi.getDetailedState() == DetailedState.CONNECTED){ Toast.makeText(this, "Wifi" , Toast.LENGTH_LONG).show(); } else if( mobile.isAvailable() && mobile.getDetailedState() == DetailedState.CONNECTED ){ Toast.makeText(this, "Mobile 3G " , Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "No Network " , Toast.LENGTH_LONG).show(); } 

este código comprueba si estás con wifi o 3g o nada, en el caso de wifi en pero no conectado a una red o 3g tienen un problema de señal que detecta estos detalles, con DetailedStates

  • Android - Get Notified cuando se detecta un nuevo punto de acceso?
  • Manteniendo Wifi-Direct activado en dispositivos AOSP
  • Android M: no se puede quitar Wi-Fi AP programáticamente
  • ¿Cómo obtener una notificación cuando un dispositivo se conecta a su android wifi tethering AP?
  • Escuchando en un puerto específico para los datos entrantes
  • Habilitación de WiFi en el emulador de Android
  • Aplicaciones de Android, comunicación con un dispositivo conectado al puerto USB
  • Servidor y cliente en un dispositivo con WiFi habilitado
  • Cómo crear WPA personalizado Hotspot con ssid y contraseña en android?
  • Cómo deshabilitar el asistente de red cautiva en el dispositivo Android?
  • Crear configuración de punto de acceso Wifi en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.