android开发中Wifi功能简单总结

那年仲夏 提交于 2019-12-02 14:46:09

负责的设置模块中有wifi的开发。结合项目中用到的wifi,简单的总结了下wifi开发功能。

1.wifi的权限管理

获取wifi需要定位权限。为什么需要定位权限呢?其实很好理解的,wifi其实也是一种定位手段,大家可能有用假药或者高德地图,wifi开启能够提高定位的准确性,所以我们加上定位的权限

2.wifi用到的重要的类和参数说明

WifiManager wifi统一管理类,进行各种wifi操作
WifiInfo 描述当前连接的wifi热点信息
WifiConfiguration wifi网络配置信息
ScanResult 描述扫描出的wifi热点的信息
参数:

SSID 描述wifi热点的名称,就是大家搜索到的直接名称,如ChinaNet
BSSID 姑且理解成热点的mac地址,但实际有所不同
networkID 数字型的id
RSSI 描述wifi信号强弱的值,官方叫做level
3.开关wifi

WifiManager mWifiManager= (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);

boolean isOpen=mWifiManager.setWifiEnabled(true);

返回值只是代表操作是否执行,不代表状态变化,wifi开关,设备有延迟性,因此需要对逻辑进行正确的处理。

4.监听设备wifi状态的改变

mWifiManager.setWifiEnabled(true);
if (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLING) {//wifi正在关闭
//do someThing;
} else if (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLED) {//wifi关闭
//do someThing;
} else if (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {//wifi正在开启
//do someThing;
} else if (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {//wifi开启
//do someThing;
} else if (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_UNKNOWN) {//wifi未知状态
//do someThing;
}

5.广播事件监听wifi状态的改变

wifi状态的变化会发出下列的广播事件:

名称 描述
WifiManager.WIFI_STATE_CHANGED_ACTION wifi开关变化通知
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION wifi扫描结果通知
WifiManager.SUPPLICANT_STATE_CHANGED_ACTION wifi连接结果通知
WifiManager.NETWORK_STATE_CHANGED_ACTION 网络状态变化通知

WifiManager.WIFI_STATE_CHANGED_ACTION wifi开关变化通知
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION wifi扫描结果通知
WifiManager.SUPPLICANT_STATE_CHANGED_ACTION wifi连接结果通知
WifiManager.NETWORK_STATE_CHANGED_ACTION 网络状态变化通知
6.获取扫描wifi结果

wifi扫描运用到的类就是ScanResult类,每一个被扫描到的wifi的信息几乎都会存在这个类的对象之中,换言之,我们获取一些基本信息就是要通过ScanResult对象:

mWifiManager.startScan();
List Results = mWifiManager.getScanResults();
for (ScanResult Result : Results) {
Log.d(TAG, “wifi结果: " + Result.SSID + " RSSI:” + Result.level + " Time:" + System.currentTimeMillis());
}
一句简单的代码就能开启扫描,第一行代码是让设备开始扫描第二行代码是获取扫描结果,我建议大家最好是在广播通知中进行结果处理,它返回的是一个List列表,之后的话,可以遍历List中的对象读取相关的信息,具体的信息获取方法也是一目了然

7.连接/断开一个wifi

如何获取已经在设备上配置过的wifi:

如何获取已经在设备上配置过的wifi:

List configurations = mWifiManager.getConfiguredNetworks();
返回的仍然是一个List列表,存储的对象是WifiConfiguration,在开始就描述过这个类,它所存储的就是设备之前连接过的所有wifi热点的信息,同样的,可以通过遍历它的实例来获取wifi热点的信息,其中SSID和networkId一定是存在的,BSSID,password这些是null的,这点一定要注意,具体代码就不贴了。

如何获取当前wifi的连接信息:

WifiInfo info = mWifiManager.getConnectionInfo();
几乎和WifiConfiguration一样的,但是如果当前没有连接wifi的话,就会返回Null,它包括了SSID、networkId、BSSID的,切记一个问题:它的SSID是带双引号的,这点和ScanResult对象不一样!

创建一个包含SSID、password等信息的自定义类封装
创建wifiConfigruation对象,并获取到networkId
用WifiManager同一管理,开始连接

public WifiConfiguration createConfiguration(AccessPoint ap) {
String SSID = ap.getSsid();
WifiConfiguration config = new WifiConfiguration();
config.SSID = “”" + SSID + “”";

String encryptionType = ap.getEncryptionType();
String password = ap.getPassword();
if (encryptionType.contains(“wep”)) {
/**

  • special handling according to password length is a must for wep
    /
    int i = password.length();
    if (((i == 10 || (i == 26) || (i == 58))) && (password.matches("[0-9A-Fa-f]
    "))) {
    config.wepKeys[0] = password;
    } else {
    config.wepKeys[0] = “”" + password + “”";
    }
    config.allowedAuthAlgorithms
    .set(WifiConfiguration.AuthAlgorithm.SHARED);
    config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
    config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    config.wepTxKeyIndex = 0;
    } else if (encryptionType.contains(“wpa”)) {
    config.preSharedKey = “”" + password + “”";
    config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    } else {
    config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    }
    return config;
    }
    然后就是通过上述方法创建一个WifiConfigruation对象并获取到它的networkId:

WifiConfiguration config = createConfiguration(ap);
//如果你设置的wifi是设备已经存储过的,那么这个networkId会返回小于0的值。
int networkId = networkId = wifiManager.addNetwork(config);

再然后就是连接了:

wifiManager.enableNetwork(networkId, true)
如果要连接已经存储过的wifi,就可以直接获取WifiConfigruation对象中的networkId进行连接,networkId在一台设备之中,是唯一的。

当然,不管你输入的密码正确或错误,该wifi连上或者未连上,都会发送广播事件进行通知,也可以在广播事件中进行相应的处理,忘记了广播类型的同学,可以翻看前文。

最后就是断开连接,很简单的一句:

mWifiManager.disconnect();

wifi的基本用法总结 了一下

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!