上一篇博客说到了Android打开WIFI的方式, 现在继续来说说如何获取wifi列表并连接wifi。
获取wifi列表需要用wifiManager.startScan();进行扫描,扫描结果的列表使用List
扫描步骤:
wifiManager.startScan(); //开启扫描
scanResultList = wifiManager.getScanResults(); // 扫描返回结果列表
注意:因为startScan是异步的,如果一直扫描,scanResultList中有可能会有些热点名称是重复的,其实是同一个热点,这时需要进行下过滤。
下面附上ScanResult的字段说明:
BSSID:fc:e3:3c:4e:f0:34
capabilities:[WPA-PSK-TKIP][ESS] 加密方案
frequency:2412
level:-48 ->信号的强弱标志(单位dBm分贝毫伏)
SSID:ChinaNet-kgdp ->我们平时输入的wifi名称
timestamp:238673772811
describeContents():0
level根据数值可以分为5个等级的信号强弱:
Level>-50 信号最强4格
-50
-65
-75
-90
连接wifi分两种,已经配置过的wifi以及未配置过的wifi
1、连接已经配置过的wifi
检查是否已经配置过该wifi,通过WifiManager获取已经配置的wifi列表
List
传入要连接的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;
}
2、连接未经配置过的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》
2、个别手机如果获取不到wifi列表很可能就是权限有问题,请检查权限。
3、无论是获取wifi列表还是连接wifi, 都要先打开wifi。
好了,获取wifi列表与wifi连接就说到这里,下篇博客我们再说下《Android开启wifi热点》