WIFI就是一种无线联网技术,常见的是使用无线路由器。那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网。如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点”。

在Android中对Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面,主要包括以下几个类和接口:

1.ScanResult
主要用来描述已经检测出的接入点,包括接入点的地址,接入点的名称,身份认证,频率,信号强度等信息。其实就是通过wifi 硬件的扫描来获取一些周边的wifi 热点的信息。

2.WifiConfiguration
Wifi网络的配置,包括安全设置等,在我们连通一个wifi 接入点的时候,需要获取到的一些信息。主要包含四个属性:

BSSID:
BSS是一种特殊的Ad-hoc LAN(一种支持点对点访问的无线网络应用模式)的应用,一个无线网络至少由一个连接到有线网络的AP和若干无线工作站组成,这种配置称为一个基本服务装置。一群计算机设定相同的 BSS名称,即可自成一个group,而此BSS名称,即所谓BSSID。通常,手机WLAN中,bssid其实就是无线路由的MAC地址。

networkid:网络ID。
PreSharedKey:无线网络的安全认证模式。
SSID:SSID(Service Set Identif)用于标识无线局域网,SSID不同的无线网络是无法进行互访的。

3.WifiInfo
wifi无线连接的描述,包括(接入点,网络连接状态,隐藏的接入点,IP地址,连接速度,MAC地址,网络ID,信号强度等信息)。这里简单介绍一下WifiManager中常用的方法:

  • getSSID() 获得SSID(热点名称)
  • getBSSID() 获取BSSID
  • getDetailedStateOf() 获取客户端的连通性
  • getHiddenSSID() 获得SSID 是否被隐藏
  • getIpAddress() 获取IP 地址
  • getLinkSpeed() 获得连接的速度
  • getMacAddress() 获得Mac地址
  • getRssi() 获得802.11n 网络的信号

4.WifiManager
wifi连接统一管理类,获取WIFI网卡的状态(WIFI网卡的状态是由一系列的整形常量来表示的)

  • WIFI_STATE_DISABLING = 0 WIFI网卡正在关闭
  • WIFI_STATE_DISABLED = 1 WIFI网卡不可用
  • WIFI_STATE_ENABLING = 2 WIFI网正在打开 (WIFI启动需要一段时间)
  • WIFI_STATE_ENABLED = 3 WIFI网卡可用
  • WIFI_STATE_UNKNOWN = 4 未知网卡状态
  • WIFI_AP_STATE_DISABLING = 10 WIFI热点正在关闭
  • WIFI_AP_STATE_DISABLED = 11 WIFI热点不可用
  • WIFI_AP_STATE_ENABLING = 12 WIFI热点正在打开
  • WIFI_AP_STATE_ENABLED = 13 WIFI热点可用
    基本权限
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

WifiManager类
操作使用WiFiManager类,它是一个系统服务,该类用于管理Wifi连接,定义了许多常量和方法,这里就不一一说了。

// 定义WifiManager对象
private WifiManager mWifiManager;

// 取得WifiManager对象
mWifiManager = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);

//打开/关闭
mWifiManager.setWifiEnabled(true); //设置为false为关闭

//判断打开状态
if (mWifiManager.isWifiEnabled()) {
    //已打开
}

//搜索WiFi列表
mWifiManager.startScan();
//扫描时在Android6.0以上设备需要有ACCESS_FINE_LOCATION权限, 并且该权限需要动态申请

//可以注册android.net.wifi.SCAN_RESULTS拦截扫描结果广播
//获取结果mWifiManager.getScanResults();

class WifiReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("m_tag", "=======onReceiver===========");
        adapter.list = wifiUtil.getWifiList();
        try {
            Log.e("m_tag", "size:" + adapter.list.size());
        } catch (NullPointerException e) {
            e.printStackTrace();
        } 
        adapter.notifyDataSetChanged();
    }
}

连接流程: 检测是否有配置过, 有则移除旧配置—>使用ssid和密码创建新配置—>添加新配置—>激活新添加的设备的id