1. 程式人生 > >Android wifi 連線問題

Android wifi 連線問題

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,如果是並且判定次數超過兩次,則表示密碼錯誤