2013-03-06 123 views
3

我想以編程方式連接到WiFi網絡。Android - 以編程方式連接到wifi

這裏是我的代碼:

wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); 
wifiManager.setWifiEnabled(true); 

WifiConfiguration config = new WifiConfiguration(); 
config.SSID = "\"" + ssid + "\""; 
config.preSharedKey = "\""+ key +"\""; 

int netId = wifiManager.addNetwork(config); 
wifiManager.saveConfiguration(); 
wifiManager.disconnect(); 
wifiManager.enableNetwork(netId, true); 
wifiManager.reconnect(); 

當我有我的手機支持WiFi,它工作正常,但問題是,當無線網絡被禁用。在這種情況下,唯一的結果是啓用WiFi適配器,但不能連接到網絡。它似乎啓用需要很長時間,所以它不會連接。另一個奇怪的事情是wifiManager.getConfiguredNetworks()返回null。你知道如何解決這個問題嗎?

謝謝

+0

我還發現,在可變的NetID爲-1,所以加入網絡失敗,我不知道爲什麼。 – 2013-03-06 20:24:46

+0

請看看這個http://stackoverflow.com/questions/4374862/how-to-programatically-create-and-read-wep-eap-wifi-configurations-in-android/4374934#4374934.I認爲這可能做你的工作。 – 2013-12-23 08:09:37

+0

嘿,...我也是@TomášČerný,...所以如何解決它? – gumuruh 2014-07-26 10:09:51

回答

4

好像使需要長期所以它不會連接。

是的。這是因爲網絡的啓用是異步完成的,它並行發生,並且不會立即發生。這裏有兩個可能的解決方案來解決你的問題:

1)這是最簡單的解決方案,但不是最好的。循環,如其他用戶所描述的那樣檢查掃描結果是否進入。但是,您應該在循環的每個循環之間添加某種睡眠。 I.E.你想等待1ms,以免吃掉所有的CPU資源。我不知道如何在Android上做到這一點。這種方法還有另一個問題。如果你在GUI線程中,當你等待連接建立時,你將以這種方式阻止所有的GUI事件。

2)這是正確的解決方案。網絡連接建立後,您可以註冊廣播事件。然後當它結束時你會得到一個事件。從這個事件中,你可以完成任何需要的操作。

對不起,趕緊回答。我不是Android專業人士,所以我不能解釋如何從頭頂上做這件事的細節,但我認爲我會至少指出你在正確的方向。

+0

他已經完成了他的問題@ user2108746? – gumuruh 2014-07-21 08:18:00

-1

實際上,如果您連接WiFi不止一次,它將解決您的問題。

我看到的另一件事是,如果我的WiFi已啓用,並且連接到特定的WiFi網絡,那麼它正在工作。

另外一件事,當我從移動網絡切換到特定的WiFi網絡,然後它給出了一個不穩定的連接..對於這個問題,我通過一個特定的WiFi網絡連接WiFi,然後在3秒延遲後再次忘記網絡我再次連接。然後它正常工作。

我使用此代碼連接到WiFi。

而對於延遲和有WiFi網絡我使用此代碼... .......

{ 
    wifi(SSID,PASS); 
    final Handler handler = new Handler(); 
    handler.postDelayed( 
     new Runnable() 
     { 
      Override public void run() { forgot(); } 
     }, 3000); 
    final Handler handler1 = new Handler(); 
    handler1.postDelayed(
     new Runnable() 
     { 
      Override public void run() {wifi(SSID,PASS); } 
     }, 3000); 
} 
+0

....... 和延遲和獲得WiFi網絡我使用此代碼... .......{SSID,PASS}; {0} {0} {0} {0} final Handler handler = new Handler(); handler.postDelayed(新的Runnable(){ 覆蓋 公共無效的run(){ 忘記();} } ,3000); Final Handler handler1 = new Handler(); handler1.postDelayed(new Runnable(){ 覆蓋public void run(){wifi(SSID,PASS);}},3000);} – user7212280 2016-11-26 06:25:59

+0

歡迎來到Stack Overflow!我編輯了你的問題。在此處發佈代碼時,請將其縮進4個空格,以便在'code markdown'中獲取。 – 2016-11-26 07:58:56

相關問題