上一篇博客说到了Android打开WIFI的方式, 现在继续来说说如何获取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信号3

-65信号2

-75信号1

-90信号0


二、连接WIFI

连接wifi分两种,已经配置过的wifi以及未配置过的wifi

1、连接已经配置过的wifi

检查是否已经配置过该wifi,通过WifiManager获取已经配置的wifi列表

List existingConfigs = wifiManager.getConfiguredNetworks();

传入要连接的wifiSSID(即wifi名称,匹配得到则不用输入密码即可连接,匹配不到则要输入密码才能连接)

这里需要注意的是:WifiConfiguration里封装的wifiSSID是包含双引号的,而ScanResultSSID是不包含双引号的,这里进行遍历比较时需要注意!对于连接已经配置过的wifi,这里遍历的结果返回一个WifiConfiguration的对象,拿来实现连接;另外这里的wifiManager已经存在了要连接的wifinetworkId,所以不用重新调用wifiManageraddNetwork方法,我们曾经出现过一个问题就是测试用久之后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);

注:这里的typewifi的加密类型,加密类型查看源码有

/**  * 加密类型  *   * @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热点》

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 配置android的adb环境变量
  3. 【android studio】 gradle配置成本地离线zip包
  4. Android(安卓)Studio工程 build.gradle 详解
  5. 一个不错的loading效果
  6. Android(安卓)ButterKnife8.2.1 使用
  7. Android中用Git来抓取你感兴趣列表的提交log
  8. Android(安卓)中 KeyEvent keycode 配置 及 转换原理
  9. Android项目清单文件

随机推荐

  1. Android中使用ormlite实现持久化(一)--He
  2. android 4.0.4系统下实现apk的静默安装和
  3. Android 显示原理简介
  4. 《Ophone应用开发权威指南》学习:Android(
  5. android studio基础教程:3.美化按钮
  6. 关于界面布局的一些小知识
  7. Android 自动编译、打包生成apk文件 3 -
  8. ViewStub的使用
  9. 几个Android控件属性笔记
  10. 译:Android(安卓)N不再支持通过Intent传递