WifiManager介绍

随着移动技术的发展,物联网(Internet of Things)这个词在我们的生活中出现的频率越来越高。
越来越多的设备需要联网。智能设备连网的方式有很多种比如直接通过SIM卡、AP配网、智能配网(SmartConfig)等。

最近为了研究AP配网方式,看了一下WifiManager这个类,分享一下用法。

初始化WifiManager  

1
WifiManager manager = (WifiManager) this.getApplicationContext().getSystemService(WIFI_SERVICE);

有两个基本的权限需要添加一下

1
2
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

否则回报SecurityException

1
java.lang.SecurityException: WifiService: Neither user 10931 nor current process has android.permission.ACCESS_WIFI_STATE.

获取Wifi状态

1
int state = manager.getWifiState();

一共有五种状态如下:

1
2
3
4
5
6
7
8
9
public static final int WIFI_STATE_DISABLING = 0; 正在禁用
public static final int WIFI_STATE_DISABLED = 1; 禁用
public static final int WIFI_STATE_ENABLING = 2; 启用中
public static final int WIFI_STATE_ENABLED = 3; 启用
public static final int WIFI_STATE_UNKNOWN = 4; 未知
```


#### 获取已经配置的wifi

List list = manager.getConfiguredNetworks();

for (WifiConfiguration configuration : list) {
Log.e(TAG, configuration.toString());
}

1
2
3
4
5
会返回手机上保存的wifi列表

> 当wifi状态是关闭的时候会返回null

#### 获取wifi信息

WifiInfo info = manager.getConnectionInfo();

1
2

#### 启用wifi

manager.setWifiEnabled(true);

1
2
3
这个方法会启用wifi开关

#### 禁用wifi

manager.setWifiEnabled(false);

1
2
3
这个方法会禁用wifi开关

#### 启用某一wifi

boolean succeeded = manager.enableNetwork(manager.getConnectionInfo().getNetworkId(), true);

1
2

#### 禁用某一wifi

boolean succeeded = manager.disableNetwork(manager.getConnectionInfo().getNetworkId());

1
2

#### 断开连接

boolean succeeded = manager.disconnect();

1
2

#### 重新连接

boolean succeeded = manager.reconnect();
boolean succeeded = manager.reassociate()

1
2
3
reconnect只有当前状态是断开才会重新连接,reassociate无论当前是什么状态都会重新连接

#### 添加网络

WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = “live_iot”;

//WPA-PSK
configuration.preSharedKey = “”” + 123456 + “””;

//WEP(已经被证明不安全)
//configuration.wepKeys[0] = “”” + 123456 + “””;

int id = manager.addNetwork(configuration);
boolean succeeded = manager.enableNetwork(id, true);

1
2
3
4
5
6
7

当使用的是WPA-PSK,密码通过preSharedKey设置。当使用的是WEP,通过wepKeys设置。
关于加密认证方式可参考[这篇文章](https://www.netspotapp.com/cn/wifi-encryption-and-security.html)

>密码错误也会添加成功,只不过连接不上

#### 更新网络

manager.updateNetwork(configuration);

1
#### 移除网络

WifiInfo info = manager.getConnectionInfo();
manager.removeNetwork(info.getNetworkId());

1
2

#### 开始扫描

boolean succeeded = manager.startScan();

1
2

#### 接收广播扫描结果

private BroadcastReceiver receiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();

    if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {

        Toast.makeText(context, "扫描成功", Toast.LENGTH_SHORT).show();

    }
}

};

1
2

#### 获取扫描结果

List scanResults = manager.getScanResults();
for (ScanResult scanResult : scanResults) {
Log.e(TAG, scanResult.SSID);
}

1
Android6.0之后需要动态申请定位权限才可以获取到扫描结果
```

经测试在红米4A上,允许此权限依然无法获取到扫描结果。

本文demo