2015-04-23 22 views
8

我正在創建一個應用程序,它可以列出ListView中所有可用的無線網絡。如果我在List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();之前緩存的列表中選擇了一個wifi,那麼它應該連接到它。如果WifiConfiguration列表不包含所選的wifi,則不會發生任何事情。我的問題是,有時我從列表中選擇一個wifi(我知道它肯定在WifiConfiguration列表中),但它不連接到它。相反,它連接到以前連接的無線網絡。經過一些嘗試(一次又一次地選擇相同的wifi),它最終連接到它。這不會總是發生,只是有時候。可能是什麼問題?這裏是我的代碼片段:連接到特定的WiFi有時失敗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; 
    } 
} 

回答

9

這就是發生了什麼事。基本上,您可以告訴操作系統禁用網絡,並且可以告訴操作系統啓用網絡,但無法告訴操作系統連接哪個網絡。

如果設備上配置了兩個範圍內的多個WiFi接入點(且兩者均處於enabled狀態),則操作系統將決定要連接哪一個WiFi接入點。

強制操作系統連接到其中一個網絡而不是另一個網絡的唯一方法是在您不想連接的範圍內的網絡上撥打disableNetwork()

讓我們通過代碼逐行:

mWifiManager.disconnect(); 

線之上告訴操作系統從當前連接的WiFi接入點斷開連接。

mWifiManager.enableNetwork(config.networkId, true); 

線之上告訴設備到網絡設置爲enabled狀態,如果它在disabled狀態以前。

mWifiManager.reconnect(); 

the documentation

重新連接到當前工作中的接入點,如果我們目前 斷開。這可能會導致異步傳遞狀態 更改事件。

所以,當你說而是它連接回到以前連接的WiFi。,它的工作與預期完全一致,因爲操作系統重新連接到它認爲的當前活動接入點

如果你真的要禁用其他網絡,使操作系統將連接到您剛纔點擊的一個,你可以做這樣的事情:

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

感謝Daniel的簡要解釋!它是如何解釋它真的很有意義!我遠離了我正在開發的機器,但明天它將是第一個嘗試它的機器! – Silex

+0

我剛剛測試出您的解決方案,並且完美地工作,謝謝! – Silex

+0

也許很重要的一點是,事情已經從Android 6開始改變了:https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-network據我所知,它將只能禁用網絡,如果這個網絡之前已被相同的應用程序所支持 – soey

0

嗨,而不是禁用以前的網絡,你可以更改連接到的網絡的優先級,而不是所有其他已配置的網絡,然後再重新連接()。它將連接到範圍內最高優先級的網絡。

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