2009-11-28 7 views
14

Questo è quello che vorrei fare:ANDROID: se WiFi sia abilitata e attiva, lanciare un intento

=> SE WiFi sia abilitata e attiva, lanciare un intento (in realtà si tratta di una WebView che ottiene il suo contenuto => le istruzioni della mia app sul web)

=> SE NON, quindi vorrei avviare un altro intento in modo che io non mostrare una WebView con "pagina Web non disponibile ... La pagina Web http://www.mywebsite.com potrebbe essere temporaneamente inattivo o potrebbe essere spostato ... "

Inizialmente ho utilizzato

if (wifi.isWifiEnabled())

ma questo non dice se la connessione Wifi è ATTIVA o no. Dice solo che l'utente ha acceso l'interruttore. Il dispositivo può o non può essere collegato ... È corretto?

Poi ho provato ad usare:

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

ma ho notato che restituisce una stringa anche se la connessione è stata persa o ha stato disabilitato ...?

Come devo fare allora?

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); 

C'è un modo più generale per verificare se il dispositivo ha la connettività a Internet appena prima di lanciare un intent? tramite Wifi, 3G, ecc ...

Grazie in anticipo per il vostro aiuto.

+0

WIFI_STAT_ENABLED significa solo che la radio WIFI è attiva. Questo non ha nulla a che fare con la connessione o meno con un punto di accesso. –

+1

davvero, quindi cosa suggeriresti? – Hubert

+0

Possibile duplicato di [come verificare se la connessione wifi è connessa in Android] (http://stackoverflow.com/questions/3841317/how-to-see-if-wifi-is-connected-in-android) –

risposta

20

È possibile utilizzare il seguente codice per verificare la connettività:

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(); 
} 

Assicurati di aver registrato l'intento android.net.conn.CONNECTIVITY_CHANGE nel vostro manifesto, altrimenti, non avrai mai ricevere una notifica che sei online.

Sono stato alle prese con questo problema negli ultimi due giorni e ho appena realizzato che avevo bisogno di registrare CONNECTIVITY_CHANGE e non solo WIFI_STATE_CHANGED.

+0

Non sarebbe più appropriato/corretto denominare questo metodo 'isConnectedViaWiFi'? –

5

Si può fare come segue:

@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); 

     } 

otterrete 0,1,2,3 a seconda di quale indicare il Wifi è in, così per esempio 2 è il collegamento, è possibile controllare il resto i documenti

8

Prova android.net.ConnectivityManager.getActiveNetworkInfo(): se restituisce null si ha alcuna connessione; se restituisce un oggetto NetworkInfo, è possibile controllare lo stato della connessione con NetworkInfo.getState() e, se è NetworkInfo.State.CONNECTED, si è connessi, altrimenti non lo si è.

+0

proverà che Grazie. H. – Hubert

+1

in effetti funziona benissimo, grazie. – Hubert

2

Nella classe 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 
     } 
    }     
} 

e nella vostra AndroidManifest.xml assicuratevi di registrarvi per la trasmissione intento android.net.wifi.supplicant.CONNECTION_CHANGE.

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

isConnected() non funziona completamente ok, la ricerca qualcos'altro

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(); 
    } 

questo controllo di codice se siete con WiFi o 3G o nulla, nel caso di wifi acceso ma non collegato a una rete o 3g ha problemi di segnale rileva questi dettagli, con DetailedStates