-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
2 涉及到的广播通知
-
WifiManager.WIFI_STATE_CHANGED_ACTION ——wifi开关变化广播
-
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION——热点扫描结果通知广播
-
WifiManager.SUPPLICANT_STATE_CHANGED_ACTION——热点连接结果通知广播
-
WifiManager.NETWORK_STATE_CHANGED_ACTION——网络状态变化广播(与上一广播协同完成连接过程通知)
3 相关属性及概念
-
networkId——连接某个wifi热点时,系统会为该热点生成一个networkId
-
ssid——wifi热点名称,可重复
-
bssid——类似于mac地址,与ssid一起可作为热点的唯一标识,同时该属性每个热点唯一不重复
4 热点加密类型
常见及需要处理的热点,包括以下3大类:
-
open——开放型网络,即无加密,可直接连接
-
wep——采用wep加密类型的热点,已过时,不安全,容易被破解,目前使用率已不足10%
-
wpa/wpa2——目前使用最广泛,相对最安全,破解难度最大的加密类型
二 开发细节
1 获取WifiManager入口类实例:
wifiManager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE);
-
1
-
2
2 打开及关闭wifi
wifiManager.setWifiEnabled(true)
- 1
true表示打开wifi开关,false表示关闭,该方法的返回值仅代表操作是否成功,不代表wifi状态的变化;
通过监听广播WifiManager.WIFI_STATE_CHANGED_ACTION ,来判断真正的wifi开关变化,该广播带有一个int型的值来表示wifi状态:
int wifistate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED); switch (wifistate) { case WifiManager.WIFI_STATE_DISABLED: //wifi已关闭 break; case WifiManager.WIFI_STATE_ENABLED: //wifi已打开 break; case WifiManager.WIFI_STATE_ENABLING: //wifi正在打开 break; default: break; }
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
3 周围热点扫描
wifiManager.startScan()
- 1
以上方法为开始扫描的接口,其返回值代表操作是否成功,扫描结果通过另外一个接口获取:
List<ScanResult> results = wifiManager.getScanResults();
- 1
一般在主动调用startScan之后,大概2秒左右,会收到WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)广播通知:
boolean isScanned = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, true);
- 1
上面的值表示,扫描结果是否已可用,若可用,则可以使用getScanResults获取结果,在结果没有就绪之前,会返回null。
4 获取已连接过的热点
所有已经连接过的热点,都会存在本地一个文件中,一般路径为/data/misc/wifi/wpa_supplicant.conf,而在程序中获取则通过以下接口:
List<WifiConfiguration> configurations = wifiManager.getConfiguredNetworks();
- 1
获取到的WiFiConfiguration对象中,只有ssid和networkId是一定有的,可以用于直接连接该热点,其他信息如bssid,密钥等信息基本都是空的。
5 获取当前wifi连接信息
WifiInfo info = wifiManager.getConnectionInfo();
- 1
该对象代表当前已连接的热点,信息,无连接时返回null;
该对象可获取包括ssid,bssid,networkId等信息。
6 连接指定热点
连接一个未连接过的热点时,需3步:
1)创建一个配置:WifiConfiguration
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) || **《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】** (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; }
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
2)生成一个networkId
WifiConfiguration config = createConfiguration(ap); /** * networkId is bigger than 0 in most time, 0 in few time and smaller than 0 in no time */ int networkId = networkId = wifiManager.addNetwork(config);