1. 程式人生 > >Android程式設計實現連線Wifi(運用Wifi 相關 API)

Android程式設計實現連線Wifi(運用Wifi 相關 API)

通過程式來實現wifi的自動連線。

       這兩天對android的wifi功能研究了一下。下面共享出自己封裝的WifiConnect類。(這裡參考了ZXing開源專案中wifi模組)

       首先,要了解android關於wifi的API.

       如果你喜歡看English API,這是android關於wifi的API地址:

       如果你一看英語就頭疼,這裡有關於wifi的api的中文解釋

       切入正題,這裡貼出一個封裝了的類(WifiConnect),在例項化WifiConnect物件時,需要傳入一個WifiManager物件。WifiConnect類向外部提供一個Connect方法,引數是無線的SSID,password,還有加密型別。

package com.example.aptest;

import java.util.List;

import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;

public class WifiConnect {
	 WifiManager wifiManager;  
     
	//定義幾種加密方式,一種是WEP,一種是WPA,還有沒有密碼的情況  
	    public enum WifiCipherType  
	    {  
	      WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID  
	    }  
	      
	//建構函式  
	    public WifiConnect(WifiManager wifiManager)  
	    {  
	      this.wifiManager = wifiManager;  
	    }  
	      
	//開啟wifi功能  
	     private boolean openWifi()  
	     {  
	         boolean bRet = true;  
	         if (!wifiManager.isWifiEnabled())  
	         {  
	          bRet = wifiManager.setWifiEnabled(true);    
	         }  
	         return bRet;  
	     }  
	      
	//提供一個外部介面,傳入要連線的無線網  
	     public boolean connect(String SSID, String Password, WifiCipherType Type)  
	     {  
	        if(!this.openWifi())  
	        {  
	             return false;  
	        }  
	//開啟wifi功能需要一段時間(我在手機上測試一般需要1-3秒左右),所以要等到wifi  
	//狀態變成WIFI_STATE_ENABLED 的時候才能執行下面的語句  
	        //WifiManager.WIFI_STATE_ENABLING 2
	        //WifiManager.WIFI_STATE_ENABLED 3
	        System.out.println("wifiManager.getWifiState()" + wifiManager.getWifiState());
	        while(wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING )  
	        {  
	        	System.out.println("wifiManager.getWifiState" + wifiManager.getWifiState());
	             try{  
	     //為了避免程式一直while迴圈,讓它睡個100毫秒在檢測……  
	              Thread.currentThread();  
	              Thread.sleep(100);  
	            }  
	            catch(InterruptedException ie){  
	           }  
	        }  
	         
	    WifiConfiguration wifiConfig = this.createWifiInfo(SSID, Password, Type);  
	        //  
	        if(wifiConfig == null)  
	        {  
	               return false;  
	        }  
	          
	        WifiConfiguration tempConfig = this.isExsits(SSID);  
	          
	        if(tempConfig != null)  
	        {  
	            wifiManager.removeNetwork(tempConfig.networkId);  
	        }  
	          
	      int netID = wifiManager.addNetwork(wifiConfig);  
	        boolean bRet = wifiManager.enableNetwork(netID, false);    
	        return bRet;  
	     }  
	       
	    //檢視以前是否也配置過這個網路  
	     private WifiConfiguration isExsits(String SSID)  
	     {  
	         List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();  
	            for (WifiConfiguration existingConfig : existingConfigs)   
	            {  
	              if (existingConfig.SSID.equals("\""+SSID+"\""))  
	              {  
	                  return existingConfig;  
	              }  
	            }  
	         return null;   
	     }  
	       
	     private WifiConfiguration createWifiInfo(String SSID, String Password, WifiCipherType Type)  
	     {  
	        WifiConfiguration config = new WifiConfiguration();    
	         config.allowedAuthAlgorithms.clear();  
	         config.allowedGroupCiphers.clear();  
	         config.allowedKeyManagement.clear();  
	         config.allowedPairwiseCiphers.clear();  
	         config.allowedProtocols.clear();  
	        config.SSID = "\"" + SSID + "\"";    
	        if(Type == WifiCipherType.WIFICIPHER_NOPASS)  
	        {  
	             config.wepKeys[0] = "\"" + "\"";;	            
	             config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);  
	            config.wepTxKeyIndex = 0;  
	            
	            //或者下面兩段程式碼也可以
	            // config.hiddenSSID = true;
	            // config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
	        }  
	        else if(Type == WifiCipherType.WIFICIPHER_WEP)  
	        {  
	            config.wepKeys[0] = "\""+Password+"\"";   
	            config.hiddenSSID = true;    
	            config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);  
	            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);  
	            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);  
	            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);  
	            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);  
	            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);  
	            config.wepTxKeyIndex = 0;  
	        }  
	        else if(Type == WifiCipherType.WIFICIPHER_WPA)  
	        {  
	        config.preSharedKey = "\""+Password+"\"";  
	        config.hiddenSSID = true;    
	        config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);    
	        config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);                          
	        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);                          
	        config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);                     
	        //config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); //這句好像不行         
	        config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);  
	       config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
	        config.status = WifiConfiguration.Status.ENABLED;    
	        }  
	        else  
	        {  
	            return null;  
	        }  
	        return config;  
	     }
}

<!-- 以下是使用wifi訪問網路所需要的許可權-->

<manifest ...><uses-featureandroid:name="android.hardware.wifi"/>
    ...
</manifest>
以及: android.permission.CHANGE_NETWORK_STATE //修改網路狀態的許可權

android.permission.CHANGE_WIFI_STATE //修改wifi狀態的許可權

android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.ACCESS_NETWORK_STATE //訪問網路許可權

android.permission.ACCESS_WIFI_STATE //訪問wifi權