WifiManager介绍

/ 移动技术 / 没有评论 / 292浏览

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

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

初始化WifiManager  

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

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

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

否则回报SecurityException

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

获取Wifi状态

int state = manager.getWifiState();

一共有五种状态如下:

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<WifiConfiguration> list = manager.getConfiguredNetworks();

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

会返回手机上保存的wifi列表

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

获取wifi信息

WifiInfo info = manager.getConnectionInfo();

启用wifi

manager.setWifiEnabled(true);

这个方法会启用wifi开关

禁用wifi

manager.setWifiEnabled(false);

这个方法会禁用wifi开关

启用某一wifi

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

禁用某一wifi

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

断开连接

boolean succeeded = manager.disconnect();

重新连接

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

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);

当使用的是WPA-PSK,密码通过preSharedKey设置。当使用的是WEP,通过wepKeys设置。 关于加密认证方式可参考这篇文章

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

更新网络

manager.updateNetwork(configuration);

移除网络

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

开始扫描

boolean succeeded = manager.startScan();

接收广播扫描结果

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();

        }
    }
};

获取扫描结果

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

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

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

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

本文demo