2015-07-20 666 views
0

我在嘗試連接無線網絡時遇到問題。 我的代碼工作正常,我成功地連接到網絡白衣下面描述的問題。android連接到wifi WifiManager.SUPPLICANT_STATE_CHANGED_ACTION奇怪的問題

我有一個listview白色wifi掃描結果。

當我點擊第一次我的接收器沒有得到「完成」狀態。 第二次點擊後,沒有選擇任何網絡連接,我的代碼在「complete」中執行。

下面的代碼是從另一個類是THRE之所以稱之爲爲什麼它是靜態

Coonect代碼:

public static boolean connect(String ssid,String password) 
{ 

    String networkSSID = ssid; 
    String networkPass = password; 
    WifiConfiguration conf = new WifiConfiguration(); 
    conf.SSID = "\"" + networkSSID + "\""; 
    conf.preSharedKey = "\""+ networkPass +"\""; 
    //WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 
    int netid=mainWifi.addNetwork(conf); 
    mainWifi.disconnect(); 
    mainWifi.enableNetwork(netid, true); 

    //mainWifi.reconnect(); <-- exact the same issue discommenting this line 
return true; 
} 

在課程中的連接是被稱爲我已經註冊BradcastReceiver如下:

public void onClick(View v) 
     { 

      mainWifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); 
      wifiinfo = mainWifi.getConnectionInfo(); 
      AuthWifi authWifi = new AuthWifi(); 
      IntentFilter mIntentFilter = new IntentFilter(); 
      mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 
      getApplicationContext().registerReceiver(authWifi, mIntentFilter); 
      ClientManager.scan(CameraActivity.this, mainWifi); 
     } 

我的廣播接收器

public class AuthWifi extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context c, Intent intent) { 
     String action = intent.getAction(); 
     if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) { 

      SupplicantState supl_state = ((SupplicantState) intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)); 
      switch (supl_state) { 

       case COMPLETED: 
        /////////////IF I AM CONNECTED THE WIFI SSID I CHOSE FROM A LISTVIEW THEN ----> 
        if(wifiinfo != null & wifiinfo.getSSID()!=null & ClientManager.getSSID() !=null& !conectado) { 

         if (wifiinfo.getSSID().contains(ClientManager.getSSID().trim())) ///I know here is better .equals() /// I have contain for my own reasons 
          conectado = true; 

/*HERE I DO SOME THINGS WHEN CONNECTED (I CALL A RUNNABLE TO MAKE A SERVER SOCKET)*/ 


         } 
        } 
        break; 
       case DISCONNECTED: 
        Log.i("SupplicantState", "Disconnected"); 

        conectado = false; 
        if (ClientStartReceive.isStopped) 
        { 
         ClientStartReceive.stop(); 
        } 
        break; 

       default: 
        Log.i("SupplicantState", "Unknown"); 
        break; 

      } 
      int supl_error = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1); 
      if (supl_error == WifiManager.ERROR_AUTHENTICATING) { 

/////HERE I MANAGE AUTHENTICATION ERROR 

      } 
     } 
    } 
} 

希望有人能夠幫助:(如果您需要更多代碼進行故障排除,請讓我知道。 如果你有一些參考幫助我,即使我需要重建代碼也被接受..我的目標是能夠連接到網絡,顯示身份驗證錯誤並執行連接susscess上的一些代碼。 對不起,我的英語我認爲你已經gessed我不是本地人。 問候

+0

在發生任何SUPPLICANT_STATE_CHANGED_ACTION之後,廣播接收器可能需要更多時間才能觸發。看看http://stackoverflow.com/questions/30889089/android-connect-to-open-wifi-programmatically-by-name-which-is-best-solution/30889687#30889687和http:// stackoverflow。 com/questions/31284285/android-wifi-broadcast-receiver-not-working-as-expected/31284820#31284820 –

+0

我幾乎可以肯定我已經通過註冊接收器來創建它。測試時我會確認 –

回答

0

作爲DOC指示「已完成」使用如下:

此狀態表示請求者已經完成其處理用於關聯的相位和該數據連接被完全配置。但請注意,可能沒有任何與連接相關的IP地址。

您不應該依賴此狀態來確保您的連接已完成。相反,您可以註冊一個BroadcastReceiver監聽器來更改網絡狀態。