2009-11-28 12 views
14

Esto es lo que me gustaría hacer:ANDROID: Si Wi-Fi está habilitado y activo, poner en marcha un intento

=> SI-Fi está habilitado y activo, poner en marcha una intención (de hecho, es una vista Web que obtiene su contenido => las instrucciones de mi aplicación en la web)

=> SI NO, entonces lanzaría otra intención para que no muestre un WebView con "página web no disponible ... La página web en http://www.mywebsite.com podría estar temporalmente fuera de servicio o puede haberse movido ... "

Originalmente debía usar

if (wifi.isWifiEnabled())

pero eso no dice si la conexión Wifi está activa o no. Solo dice que el usuario ha activado el interruptor. El dispositivo puede o no estar conectado ... ¿Es esto correcto?

Luego trató de usar:

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

pero me di cuenta de que devuelve una cadena que incluso si la conexión se ha perdido o tiene estado 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); 

¿Hay una manera más general para comprobar 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 su ayuda.

+0

WIFI_STAT_ENABLED solo significa que la radio WIFI está encendida. Esto no tiene nada que ver con el hecho de que esté o no realmente conectado a un punto de acceso. –

+1

de hecho, ¿qué sugieres? – Hubert

+0

Posible duplicado de [cómo ver si wifi está conectado en Android] (http://stackoverflow.com/questions/3841317/how-to-see-if-wifi-is-connected-in-android) –

Respuesta

20

Usted puede utilizar el siguiente código para comprobar si hay 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(); 
} 

Por favor asegúrese de que se haya registrado la intención android.net.conn.CONNECTIVITY_CHANGE en su Manifiesto, o de lo contrario, nunca recibir una notificación de que estás en línea.

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

+0

¿No sería más apropiado/correcto llamar a este método 'isConnectedViaWiFi'? –

5

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 del estado en el Wi-Fi está en, por lo que para el ejemplo 2 se conecta, se puede comprobar en el resto los documentos

8

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

+0

intentará eso Gracias. H. – Hubert

+1

de hecho que funciona muy bien, gracias. – Hubert

2

En su clase de 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 sus AndroidManifest.xml Asegúrese de registrarse para la emisión intención android.net.wifi.supplicant.CONNECTION_CHANGE.

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

isConnected() no funciona completamente bien, la investigación 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(); 
    } 

el código de verificación si estás con WiFi o 3G o nada, en el caso de wifi encendido pero no conectado a una red o 3g tiene un problema con la señal que detecta estos detalles, con DetailedStates

Cuestiones relacionadas