獲取wifi列表並鏈接wifi


1、獲取wifi列表web

獲取wifi列表須要用wifiManager.startScan();進行掃描,掃描結果的列表使用List<ScanResult> 保存緩存

掃描步驟:網絡

wifiManager.startScan(); //開啓掃描異步

scanResultList = wifiManager.getScanResults(); // 掃描返回結果列表測試

注意:由於startScan是異步的,若是一直掃描,scanResultList中有可能會有些熱點名稱是重複的,實際上是同一個熱點,這時須要進行下過濾。this

下面附上ScanResult的字段說明:加密

BSSID:fc:e3:3c:4e:f0:34.net

capabilities:[WPA-PSK-TKIP][ESS]   加密方案對象

frequency:2412ip

level:-48 ->信號的強弱標誌(單位dBm分貝毫伏)

SSID:ChinaNet-kgdp ->咱們平時輸入的wifi名稱

timestamp:238673772811

describeContents():0

 

level根據數值能夠分爲5個等級的信號強弱:

Level>-50           信號最強4格

-50<Level<-65  信號3格

-65<Level<-75  信號2格

-75<Level<-90  信號1格

-90<Level          信號0格


2、鏈接WIFI

鏈接wifi分兩種,已經配置過的wifi以及未配置過的wifi

一、鏈接已經配置過的wifi

檢查是否已經配置過該wifi,經過WifiManager獲取已經配置的wifi列表

List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();

傳入要鏈接的wifi的SSID(即wifi名稱,匹配獲得則不用輸入密碼便可鏈接,匹配不到則要輸入密碼才能鏈接)

這裏須要注意的是:WifiConfiguration裏封裝的wifi的SSID是包含雙引號的,而ScanResult的SSID是不包含雙引號的,這裏進行遍歷比較時須要注意!對於鏈接已經配置過的wifi,這裏遍歷的結果返回一個WifiConfiguration的對象,拿來實現鏈接;另外這裏的wifiManager已經存在了要鏈接的wifi的networkId,因此不用從新調用wifiManager的addNetwork方法,咱們曾經出現過一個問題就是測試用久以後wifi鏈接會變得很慢,緣由就是咱們一每次鏈接都調用了addNetwork方法,引發緩存過多,因此這裏切記不能亂用addNetwork。

下面來看看代碼實現:

    /**
     * 已有配置連接
     *
     * @param wf
     * @return
     */
    public boolean Connect(WifiConfiguration wf) {
        if (!this.OpenWifi()) {
            return false;
        }
        // 狀態變成WIFI_STATE_ENABLED的時候才能執行下面的語句,即當狀態爲WIFI_STATE_ENABLING時,讓程序在while裏面跑
        while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {
            try {
                // 爲了不程序一直while循環,讓它睡個100毫秒在檢測……
                Thread.currentThread();
                Thread.sleep(100);
            } catch (InterruptedException ie) {
            }
        }
        boolean bRet = wifiManager.enableNetwork(wf.networkId, true);
        wifiManager.saveConfiguration();
        return bRet;
    }

二、鏈接未經配置過的wifi

輸入密碼,根據密碼建立一個配置信息類

WifiConfiguration wifiConfig = this.CreateWifiInfo(SSID, Password, Type);

注:這裏的type是wifi的加密類型,加密類型查看源碼有

    /**
     * 加密類型
     *  
     * @author Administrator
     *  
     */  
    public enum WifiCipherType {  
        WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID  
    }  


通常使用WIFICIPHER_WPA這種加密方式,還有web以及無密碼的方式。


而後調用addNetwork把配置信息加入WifiManager(這裏返回networkId ),加入後默認是DISABLED(即斷開狀態的),還要再調用WifiManager.enableNetwork(int netId, boolean disableOthers)去啓用,這裏傳入參數addNetwork方法返回的networkId ,就能啓動鏈接了,布爾值傳入true,關閉別的網絡,代碼:

    /**
     * 無配置記錄連接方式
     *  
     * @param SSID
     * @param Password
     * @param Type
     * @return true or false
     */  
    public boolean Connect(String SSID, String Password, WifiCipherType Type) {  
        if (!this.OpenWifi()) {  
            return false;  
        }  
        // 狀態變成WIFI_STATE_ENABLED的時候才能執行下面的語句  
        while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {  
            try {  
                // 爲了不程序一直while循環,讓它睡個100毫秒在檢測……  
                Thread.currentThread();  
                Thread.sleep(100);  
            } catch (InterruptedException ie) {  
            }  
        }  
       
        WifiConfiguration wifiConfig = this.CreateWifiInfo(SSID, Password, Type);  
        int netID = wifiManager.addNetwork(wifiConfig);  
        boolean bRet = wifiManager.enableNetwork(netID, true);  
        wifiManager.saveConfiguration();  
        return bRet;  
    }  

 

注意點:

一、首先權限,權限請參考上一篇博客:《1、Android打開WIFI》

二、個別手機若是獲取不到wifi列表極可能就是權限有問題,請檢查權限。

三、不管是獲取wifi列表仍是鏈接wifi, 都要先打開wifi。

好了,獲取wifi列表與wifi鏈接就說到這裏,下篇博客咱們再說下《Android開啓wifi熱點》  

相關文章
相關標籤/搜索