获取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热点》  

相关文章
相关标签/搜索