2015-04-23 10 views
8

Sto creando un'app, che può elencare tutti i wifi disponibili in un ListView. Se seleziono uno dei wifi nell'elenco, che è stato memorizzato nella cache prima in List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();, dovrebbe collegarsi ad esso. Se l'elenco WifiConfiguration non contiene il wifi selezionato, non succede nulla. Il mio problema è che a volte seleziono un wifi dalla lista (che so per certo è nella lista WifiConfiguration), ma non si connette ad esso. Invece si ricollega al wifi precedentemente connesso. Dopo alcuni tentativi (selezionando ancora e ancora lo stesso wifi) si connette finalmente ad esso. Questo non succede sempre, solo qualche volta. Quale può essere il problema? Ecco il mio frammento di codice:Connessione a uno specifico wifi a volte non riesce su Android

// Go through all the cached wifis and check if the selected GoPro was cached before 
for (WifiConfiguration config : configurations) { 
    // If it was cached connect to it and that's all 
    if (config.SSID != null && config.SSID.equals("\"" + mDrawerListView.getAdapter().getItem(position) + "\"")) { 
     // Log 
     Log.i("onReceive", "Connecting to: " + config.SSID); 
     mWifiManager.disconnect(); 
     mWifiManager.enableNetwork(config.networkId, true); 
     mWifiManager.reconnect(); 
     break; 
    } 
} 

risposta

9

Questo è quello che sta succedendo. Fondamentalmente, puoi dire al sistema operativo di disabilitare una rete, e puoi dire al sistema operativo di abilitare una rete, ma non è possibile dire al sistema operativo a quale rete connettersi.

Se ci sono più punti di accesso Wi-Fi nel raggio che sono entrambi configurati sul dispositivo (ed entrambi sono nello stato enabled), il sistema operativo deciderà a quale connettersi.

L'unico modo per forzare il sistema operativo a connettersi a una delle reti nell'intervallo anziché l'altro è chiamare disableNetwork() sulla rete nell'intervallo a cui non si desidera connettersi.

Andiamo attraverso il vostro codice riga per riga:

mWifiManager.disconnect(); 

La linea di cui sopra dice al sistema operativo di scollegare dal punto di accesso Wi-Fi attualmente collegato.

mWifiManager.enableNetwork(config.networkId, true); 

La riga precedente indica al dispositivo per impostare la rete allo stato enabled se era già in stato disabled.

mWifiManager.reconnect(); 

Da the documentation:

riconnessione al punto di accesso attivo, se siamo attualmente scollegato. Ciò potrebbe comportare la consegna asincrona degli eventi di stato .

Quindi, quando si dice Invece si ricollega al wifi precedentemente connesso., funziona esattamente come previsto, poiché il sistema operativo si riconnette a quello che considera il punto di accesso attualmente attivo.

Se davvero si vuole disabilitare l'altra rete in modo che il sistema operativo si collegherà a quello che hai appena cliccato su, si potrebbe fare qualcosa di simile:

// Go through all the cached wifis and check if the selected GoPro was cached before 

WifiInfo info = mWifiManager.getConnectionInfo(); //get WifiInfo 
int id = info.getNetworkId(); //get id of currently connected network 

for (WifiConfiguration config : configurations) { 
    // If it was cached connect to it and that's all 
    if (config.SSID != null && config.SSID.equals("\"" + mDrawerListView.getAdapter().getItem(position) + "\"")) { 
     // Log 
     Log.i("onReceive", "Connecting to: " + config.SSID); 

     mWifiManager.disconnect(); 

     mWifiManager.disableNetwork(id); //disable current network 

     mWifiManager.enableNetwork(config.networkId, true); 
     mWifiManager.reconnect(); 
     break; 
    } 
} 
+0

Grazie per la breve spiegazione Daniel! Ha davvero senso come lo hai spiegato! Sono lontano dalla mia macchina su cui sto facendo lo sviluppo, ma domani sarà la prima cosa da provare! – Silex

+0

Ho appena testato la tua soluzione e funziona perfettamente, grazie! – Silex

+0

Forse è importante sapere che le cose sono cambiate a partire da Android 6: https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-network Come capisco, sarà possibile disabilitare la rete solo se questa rete è già stata utilizzata dalla stessa applicazione – soey

0

Hi invece di disattivazione della rete precedente, può cambiare la priorità della rete a cui connettersi più di tutte le altre reti configurate e poi quando ti riconnetti(). si collegherà alla rete con priorità più alta nel raggio d'azione.

wificonfig.priority = 10000; 
wifiManager.updateNetwork(wificonfig); 
wifiManager.saveConfiguration(); 
wifiManager.disconnect(); 
wifiManager.enableNetwork(i.networkId, false); 
wifiManager.reconnect(); 
Problemi correlati