我們正在開發一款適用於Android的小應用程序,以便在同一網絡(相同的SSID和相同的網絡配置,但不同的物理位置)中的兩個不同無線接入點之間平滑切換,目的是不丟棄現有連接在切換執行之後。我一直在閱讀幾篇文章,解釋如何以編程方式控制wifi,現在我們有一半的工作解決方案。Android中的平滑WiFi切換
我們實現它的方式是,服務根據我們的標準以最佳信號掃描AP,如果它不同於系統當前連接的AP,它將切換到新的AP。代碼的相關部分:
...
// Some initializations and bestOne is the ScanResult with the best signal
conf.BSSID = bestOne.BSSID;
actualNid = mWifiManager.updateNetwork(conf);
mWifiManager.enableNetwork(actualNid, false);
mWifiManager.saveConfiguration();
conf = getWifiConfiguration(mWifiManager, conf);
if(conf == null) {
return;
}
if(!mWifiManager.enableNetwork(conf.networkId, true)) {
return;
}
if (mWifiManager.reconnect()) {
// Great
} else {
// Error
}
問題是所有的執行都會經過預期的代碼路徑。然而,切換並未真正執行,日誌顯示爲執行重新連接,並返回true。此外,沒有收到任何來自SUPPLICANT_CONNECTION_CHANGE_ACTION或SUPPLICANT_STATE_CHANGED_ACTION的事件,所以似乎甚至沒有觸發切換。
另一個事實是,如果我們在啓用網絡之前插入一個mWifiManager.disconnect()切換實際上執行。不過,這並不是一種選擇,因爲正在運行的應用程序會失去連接,從而導致會話中斷,這正是我們想要避免的。
任何建議都是值得歡迎的。
我不認爲這是可能實現從應用程序內。在可能的WiFi驅動程序級別上,但它不是那麼容易:http://code.google.com/p/android/issues/detail?id=12649(說「這是一個硬件特定的功能」 - 所以可能甚至沒有驅動程序級別) – zapl