2015-04-23 4 views
8

Ich erstelle eine App, die alle verfügbaren WLANs in einem ListView auflisten kann. Wenn ich eines der WLANs in der Liste auswähle, das zuvor in List<WifiConfiguration> list = wifiManager.getConfiguredNetworks(); zwischengespeichert wurde, dann sollte es sich damit verbinden. Wenn die Liste WifiConfiguration das ausgewählte WLAN nicht enthält, passiert nichts. Mein Problem ist, dass ich manchmal ein WLAN aus der Liste (die ich sicher in der WifiConfiguration Liste ist) wählen, aber es verbindet sich nicht mit ihm. Stattdessen verbindet es sich mit dem zuvor verbundenen WLAN. Nach einigen Versuchen (immer wieder das selbe WLAN auswählend) verbindet es sich schließlich damit. Dies geschieht nicht immer, nur manchmal. Was kann das Problem sein? Hier ist mein Code-Schnipsel:Verbindung zu bestimmten Wi-Fi schlägt manchmal auf 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; 
    } 
} 

Antwort

9

Das ist, was los ist. Grundsätzlich können Sie das Betriebssystem anweisen, ein Netzwerk zu deaktivieren, und Sie können dem Betriebssystem mitteilen, dass ein Netzwerk aktiviert werden soll. Es ist jedoch nicht möglich, dem Betriebssystem mitzuteilen, mit welchem ​​Netzwerk eine Verbindung hergestellt werden soll.

Wenn mehrere WLAN-Zugriffspunkte in Reichweite sind, die beide auf dem Gerät konfiguriert sind (und beide im Status enabled sind), entscheidet das Betriebssystem, mit welcher Verbindung eine Verbindung hergestellt werden soll.

Die einzige Möglichkeit, das Betriebssystem zu zwingen, eine Verbindung zu einem der Netzwerke in Reichweite statt der anderen herzustellen, besteht darin, disableNetwork() im Netzwerk anzurufen, das sich im Bereich befindet, mit dem Sie keine Verbindung herstellen möchten.

Lassen Sie uns Ihre Code Zeile für Zeile durchgehen:

mWifiManager.disconnect(); 

Die Zeile oben weist das Betriebssystem aus dem aktuell verbundenen WiFi-Zugangspunkt zu trennen.

mWifiManager.enableNetwork(config.networkId, true); 

die Zeile über teilt das Gerät das Netzwerk an den enabled Zustand zu setzen, wenn es zuvor in dem Zustand disabled ist.

mWifiManager.reconnect(); 

Von the documentation:

Reconnect an den derzeit aktiven Zugangspunkt, wenn wir zur Zeit getrennt sind. Dies kann zu einer asynchronen Zustellung des Status change events führen.

Also, wenn Sie sagen, Stattdessen verbindet es sich wieder mit dem zuvor verbundenen WLAN. funktioniert es genau wie erwartet, da das Betriebssystem wieder eine Verbindung mit dem aktiven Access Point herstellt.

Wenn Sie wirklich das andere Netzwerk deaktivieren möchten, so dass das Betriebssystem auf die eine Verbindung herstellt Sie gerade geklickt haben, könnten Sie so etwas tun:

// 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

Danke für die kurze Erklärung Daniel! Es macht wirklich Sinn, wie du es erklärt hast! Ich bin weg von meiner Maschine, auf der ich die Entwicklung mache, aber morgen wird es die erste Sache sein, die es ausprobiert! – Silex

+0

Ich habe gerade Ihre Lösung getestet und es funktioniert perfekt, danke! – Silex

+0

Es ist vielleicht wichtig zu wissen, dass die Dinge seit Android 6 geändert wurden: https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-network Wie ich es verstehe, es wird nur möglich sein, das Netzwerk zu deaktivieren, wenn dieses Netzwerk zuvor von der gleichen Anwendung unterstützt wurde – soey

0

Hallo stattdessen das vorherige Netzwerk zu deaktivieren, Sie kann die Priorität des Netzwerks ändern, zu dem Sie eine Verbindung herstellen möchten, größer als alle anderen konfigurierten Netzwerke und dann, wenn Sie die Verbindung wiederherstellen(). Es wird mit dem Netzwerk mit der höchsten Priorität in Reichweite verbunden.

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