Android wifi 連線問題
阿新 • • 發佈:2019-01-10
2.如何知道WIFI是否已連線上
(1)enableNetwork(res, true)的返回值只是這個函式是否執行成功,當密碼錯誤但是輸入密碼長度足夠時這個函式仍會返回true,所以不代表是否已連上WIFI
(2)收到NETWORK_STATE_CHANGED_ACTION訊息的情況有多種 未連線---------->已連線 未連線/已連線 ---------->WIFI關閉
所以在收到 NETWORK_STATE_CHANGED_ACTION之後需判斷WIFI是否已真正連線上,判斷方法為
public boolean isWifiConnect() {
ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo ni = connManager.getActiveNetworkInfo();
return (ni != null && ni.isConnectedOrConnecting());
}
返回為true表示已連線,反之則未連線
所以通過以下方式判斷wifi是否正確連線
mWifiManager.addNetwork( mWifiManager.CreateWifiInfo( result.SSID, passwordstr, 3)); mThreads.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub //有問題,null String ssid; do { ssid = mWifiManager.getWifiInfo().getSSID(); if(ssid != null && (ssid.equals(result.SSID) || ssid.equals('"'+result.SSID+'"'))&&mWifiManager.isWifiConnect()) break; try { Thread.sleep(1000); OutputDebug.OutputDebugLogD(MYLOG, "msgid:"+msgid+" ssid:"+ssid +" result.SSID:"+result.SSID); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }while(!mbDestroy); if(msgid >= 0 && mHandler != null) mHandler.sendEmptyMessageDelayed(msgid,10);
在廣播內判斷當前wifi連線狀態:
private BroadcastReceiver mWifiConnectReceiver = new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent intent) { // TODO Auto-generated method stub if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { int message = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1); switch (message) { case WifiManager.WIFI_STATE_DISABLED: //Toast.makeText(getApplicationContext(), "不可用", Toast.LENGTH_SHORT).show(); break; case WifiManager.WIFI_STATE_DISABLING: //Toast.makeText(getApplicationContext(), "正在關閉或者斷開", Toast.LENGTH_SHORT).show(); break; case WifiManager.WIFI_STATE_ENABLED: //Toast.makeText(getApplicationContext(), "可用", Toast.LENGTH_SHORT).show(); break; case WifiManager.WIFI_STATE_ENABLING: //Toast.makeText(getApplicationContext(), "正在開啟或者連線", Toast.LENGTH_SHORT).show(); break; case WifiManager.WIFI_STATE_UNKNOWN: //Toast.makeText(getApplicationContext(), "未知", Toast.LENGTH_SHORT).show(); break; default: break; } }else if(intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) { WifiInfo wifiInfo = mWifiManager.getWifiInfo(); state = wifiInfo.getSupplicantState(); String str = ""; if(state == SupplicantState.SCANNING) { str = "正在掃描"; } if(state == SupplicantState.ASSOCIATED) { str = "關聯AP成功"; }else if(state.toString().equals("AUTHENTICATING")) { str = "正在驗證"; }else if(state == SupplicantState.ASSOCIATING) { str = "正在關聯AP..."; }else if(state == SupplicantState.COMPLETED) { str = "連線成功"; }else if(state == SupplicantState.INACTIVE) { } else if(state.toString().equals("DISCONNECTED")){ OutputDebug.OutputDebugLogD(STORAGE_SERVICE,mConnectCount+""); if(mConnectCount <1) mConnectCount++; else { Toast.makeText(getApplicationContext(), "密碼錯誤", Toast.LENGTH_SHORT).show(); } } OutputDebug.OutputDebugLogD(STORAGE_SERVICE, "state:"+state); //Toast.makeText(getApplicationContext(),str, Toast.LENGTH_SHORT).show(); } } };
迴圈掃描網路,連線成功後退出迴圈,否則在廣播WifiManager.SUPPLICANT_STATE_CHANGED_ACTION判斷當前state的值是否為DISCONNECTED,如果是並且判定次數超過兩次,則表示密碼錯誤