负责的设置模块中有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的基本用法总结 了一下
来源:https://blog.csdn.net/daoxiaomianzi/article/details/102776186