1、WifiManager 操作wifi的管理类 ,通过系统服务获取:
wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true/false); //打开或者关闭wifi
wifiManager.startScan(); //开始扫描
wifiManager.getScanResults(); //获取扫描的热点结果
wifiManager.removeNetwork( int networkId); //移除某个缓存的连接,可以用作忘记之前连接过的wifi密码
wifiManager.saveConfiguration(); //保存当前的连接缓存配置
2、WifiConfiguration 表示wifi网络连接的信息
WifiConfiguration.SSID // WIFI网络的名字,也就是显示在我们wifi列表上的名字
WifiConfiguration.networkId //网络连接号,只要进行过连接的,不管成功与否,都会存在网络连接号
WifiConfiguration.getIpAddress() //获取连接的ip地址
WifiConfiguration.getMacAddress() //获取连接的mac地址
WifiConfiguration.getLinkSpeed() //获取连接速度
//判断wifi连接中的加密类型
public static int getSecurity(WifiConfiguration config) {
if (config.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
return SECURITY_PSK;
}
if (config.allowedKeyManagement.get(KeyMgmt.WPA_EAP) ||
config.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
return SECURITY_EAP;
}
return (config.wepKeys[0] != null) ? SECURITY_WEP : SECURITY_NONE;
}
3、ScanResult 扫描结果类
ScanResult.SSID //扫描的网络名称
ScanResult.level //网络的信号等级
//获取扫描的网络加密的类型
public static int getSecurity(ScanResult result) {
if (result.capabilities.contains("WEP")) {
return SECURITY_WEP;
} else if (result.capabilities.contains("PSK")) {
return SECURITY_PSK;
} else if (result.capabilities.contains("EAP")) {
return SECURITY_EAP;
}
return SECURITY_NONE;
}
//通过注册监听扫描变化的广播,来获取系统扫描结果的变化
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
4、WifiInfo 当前正在连接的wifi网络信息
WifiInfo.getSSID() //获取网络连接名称,但是不是每一次都能够获取到
WifiInfo.getNetworkId() //连接的网络号
//通过注册连接状态改变的广播,来更新连接状态
WifiManager.SUPPLICANT_STATE_CHANGED_ACTION
...
//获取连接状态
SupplicantState state = (SupplicantState) intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE);
//SupplicantState是一个枚举类型
SupplicantState.ASSOCIATED //关联完成
SupplicantState.ASSOCIATING //正在进行关联
SupplicantState.COMPLETED //连接和认证已经完成
SupplicantState.DISCONNECTED //当前网络不能接入
SupplicantState.SCANNING //扫描中
// 密码错误,清除保存
int linkWifiResult = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 123);
if (wifiSateChangeListener != null && linkWifiResult == WifiManager.ERROR_AUTHENTICATING) {
removeNetworkLink(); //清除该网络名称对应的网络连接的缓存
}
5、清除特定的网络
public void removeNetworkLink(String SSID) {
List existingConfigs = wifiManager.getConfiguredNetworks();
for (WifiConfiguration existingConfig : existingConfigs) {
if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
wifiManager.removeNetwork(existingConfig.networkId);
wifiManager.saveConfiguration();
return;
}
}
}
6、实战经验: 连接一个没有密码的热点,然后修改热点为WAP2 PSK密码协议。如果在热点密码修改之后,我们没有清除已经存在的连接,那么后面是无法再连上这个网络的了。开始我是在热点连接状态变为SupplicantState.DISCONNECTED 的时候,去移除当前的网络,但是发现我获取到的WifiInfo里面,SSID是空的;后面改为在WifiManager.SCAN_RESULTS_AVAILABLE_ACTION广播变化的时候,去对比缓存配置信息和扫描的信息,如果发现同一个SSID的网络中的加密类型不一样,那么我们就手动移除这个网络。下面是代码片段:
List results = wifiManager.getScanResults();
List configs = wifiManager.getConfiguredNetworks();
if (results != null) {
for (ScanResult result : results) {
if (result.SSID == null || result.SSID.length() == 0 || result.capabilities.contains("[IBSS]")) {
continue;
}
for(WifiConfiguration config : configs){
if(removeDoubleQuotes(config).equals(result.SSID) && getSecurity(config)!=getSecurity(result)){
//如果SSID相同且加密方式不同,清除该网络
removeNetworkLink(config.networkId);
}
}
}
}