首先看一下WiFi的自我介绍:
Wi-Fi是一种允许电子设备连接到一个无线局域网(WLAN)的技术,通常使用2.4G UHF或5G SHF ISM 射频频段。连接到无线局域网通常是有密码保护的;但也可是开放的,这样就允许任何在WLAN范围内的设备可以连接上。
wifi可以说是Android开发中非常重要的一部分了,这里用到了一个WifiAdmin工具类。
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
|
package
com.qdzn.home.wifi;
import
android.content.Context;
import
android.net.wifi.ScanResult;
import
android.net.wifi.WifiConfiguration;
import
android.net.wifi.WifiInfo;
import
android.net.wifi.WifiManager;
import
android.net.wifi.WifiManager.WifiLock;
import
java.lang.reflect.Method;
import
java.util.List;
/**
* wifi工具类
*/
public
class
WifiAdmin {
public
static
final
String SSID =
"nexus"
;
public
static
final
String PassWord =
"12345678"
;
private
WifiManager mWifiManager;
// 定义WifiInfo对象
private
WifiInfo mWifiInfo;
// 扫描出的网络连接列表
private
List<scanresult> mWifiList;
// 网络连接列表
private
List<wificonfiguration> mWifiConfiguration;
// 定义一个WifiLock
WifiLock mWifiLock;
// 构造器
public
WifiAdmin(Context context) {
// 取得WifiManager对象
mWifiManager = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
// 取得WifiInfo对象
mWifiInfo = mWifiManager.getConnectionInfo();
}
// 打开WIFI
public
void
openWifi() {
if
(!mWifiManager.isWifiEnabled()) {
mWifiManager.setWifiEnabled(
true
);
//开始扫描WIFI
startScan();
}
}
// 关闭WIFI
public
void
closeWifi() {
if
(mWifiManager.isWifiEnabled()) {
mWifiManager.setWifiEnabled(
false
);
}
}
//创建热点
public
void
createAp() {
if
(mWifiManager.isWifiEnabled()) {
mWifiManager.setWifiEnabled(
false
);
}
try
{
WifiConfiguration apConfiguration =
new
WifiConfiguration();
apConfiguration.SSID = WifiAdmin.SSID;
apConfiguration.preSharedKey = WifiAdmin.PassWord;
apConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
Method method = mWifiManager.getClass().getMethod(
"setWifiApEnabled"
, WifiConfiguration.
class
,
boolean
.
class
);
method.invoke(mWifiManager, apConfiguration,
true
);
}
catch
(Exception e) {
e.printStackTrace();
}
}
/**
* 关闭WiFi热点
*/
public
void
closeWifiAp() {
if
(isWifiApEnabled()) {
try
{
Method method = mWifiManager.getClass().getMethod(
"getWifiApConfiguration"
);
method.setAccessible(
true
);
WifiConfiguration config = (WifiConfiguration) method.invoke(mWifiManager);
Method method2 = mWifiManager.getClass().getMethod(
"setWifiApEnabled"
, WifiConfiguration.
class
,
boolean
.
class
);
method2.invoke(mWifiManager, config,
false
);
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
/**
* 判断热点是否打开
*
* @return
*/
public
boolean
isWifiApEnabled() {
try
{
Method method = mWifiManager.getClass().getMethod(
"isWifiApEnabled"
);
method.setAccessible(
true
);
return
(Boolean) method.invoke(mWifiManager);
}
catch
(Exception e) {
e.printStackTrace();
}
return
false
;
}
// 检查当前WIFI状态
public
int
checkState() {
return
mWifiManager.getWifiState();
}
// 锁定WifiLock
public
void
acquireWifiLock() {
mWifiLock.acquire();
}
// 解锁WifiLock
public
void
releaseWifiLock() {
// 判断时候锁定
if
(mWifiLock.isHeld()) {
mWifiLock.acquire();
}
}
// 创建一个WifiLock
public
void
creatWifiLock() {
mWifiLock = mWifiManager.createWifiLock(
"Test"
);
}
// 得到配置好的网络
public
List<wificonfiguration> getConfiguration() {
return
mWifiConfiguration;
}
// 指定配置好的网络进行连接
public
void
connectConfiguration(
int
index) {
// 索引大于配置好的网络索引返回
if
(index > mWifiConfiguration.size()) {
return
;
}
// 连接配置好的指定ID的网络
mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,
true
);
}
/**
* 扫描WIFI
*/
public
void
startScan() {
mWifiManager.startScan();
// 得到扫描结果
mWifiList = mWifiManager.getScanResults();
// 得到配置好的网络连接
mWifiConfiguration = mWifiManager.getConfiguredNetworks();
}
// 得到网络列表
public
List<scanresult> getWifiList() {
return
mWifiList;
}
// 查看扫描结果
public
StringBuilder lookUpScan() {
StringBuilder stringBuilder =
new
StringBuilder();
for
(
int
i =
0
; i < mWifiList.size(); i++) {
stringBuilder
.append(
"Index_"
+
new
Integer(i +
1
).toString() +
":"
);
// 将ScanResult信息转换成一个字符串包
// 其中把包括:BSSID、SSID、capabilities、frequency、level
stringBuilder.append((mWifiList.get(i)).toString());
stringBuilder.append(
"/n"
);
}
return
stringBuilder;
}
// 得到MAC地址
public
String getMacAddress() {
return
(mWifiInfo ==
null
) ?
"NULL"
: mWifiInfo.getMacAddress();
}
// 得到接入点的BSSID
public
String getBSSID() {
return
(mWifiInfo ==
null
) ?
"NULL"
: mWifiInfo.getBSSID();
}
// 得到IP地址
public
int
getIPAddress() {
return
(mWifiInfo ==
null
) ?
0
: mWifiInfo.getIpAddress();
}
// 得到连接的ID
public
int
getNetworkId() {
return
(mWifiInfo ==
null
) ?
0
: mWifiInfo.getNetworkId();
}
// 得到WifiInfo的所有信息包
public
String getWifiInfo() {
return
(mWifiInfo ==
null
) ?
"NULL"
: mWifiInfo.toString();
}
// 添加一个网络并连接
public
void
addNetwork(WifiConfiguration wcg) {
System.out.println(
"进行添加网络:"
);
int
wcgID = mWifiManager.addNetwork(wcg);
boolean
b = mWifiManager.enableNetwork(wcgID,
true
);
System.out.println(
"b--"
+ b);
}
// 断开指定ID的网络
public
void
disconnectWifi(
int
netId) {
mWifiManager.disableNetwork(netId);
mWifiManager.disconnect();
}
// 然后是一个实际应用方法
public
WifiConfiguration CreateWifiInfo(String SSID, String Password,
int
Type) {
WifiConfiguration config =
new
WifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.SSID =
"\""
+ SSID +
"\""
;
WifiConfiguration tempConfig =
this
.IsExsits(SSID);
if
(tempConfig !=
null
) {
mWifiManager.removeNetwork(tempConfig.networkId);
}
if
(Type ==
1
)
// WIFICIPHER_NOPASS
{
config.wepKeys[
0
] =
""
;
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex =
0
;
}
if
(Type ==
2
)
// WIFICIPHER_WEP
{
config.hiddenSSID =
true
;
config.wepKeys[
0
] =
"\""
+ Password +
"\""
;
config.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.SHARED);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedGroupCiphers
.set(WifiConfiguration.GroupCipher.WEP104);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex =
0
;
}
if
(Type ==
3
)
// WIFICIPHER_WPA
{
config.preSharedKey =
"\""
+ Password +
"\""
;
config.hiddenSSID =
true
;
config.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.TKIP);
// config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.CCMP);
config.status = WifiConfiguration.Status.ENABLED;
}
return
config;
}
private
WifiConfiguration IsExsits(String SSID) {
List<wificonfiguration> existingConfigs = mWifiManager
.getConfiguredNetworks();
for
(WifiConfiguration existingConfig : existingConfigs) {
System.out.println(existingConfig.SSID);
if
(existingConfig.SSID.equals(
"\""
+ SSID +
"\""
)) {
System.out.println(
"拿到了相同配置对象:"
+ existingConfig.SSID);
return
existingConfig;
}
}
return
null
;
}
/**
* ip地址转换
* @param i
* @return
*/
public
static
String intToIp(
int
i) {
return
(i &
0xFF
) +
"."
+ ((i >>
8
) &
0xFF
) +
"."
+ ((i >>
16
) &
0xFF
) +
"."
+ ((i >>
24
) &
0xFF
);
}
}</wificonfiguration></scanresult></wificonfiguration></wificonfiguration></scanresult>
|
使用方法
1.初始化工具类
1
2
3
4
5
6
7
8
9
10
11
|
//首先需要获取到wifi管理者,初始化工具类
WifiAdmin wifiAdmin =
new
WifiAdmin(
this
);
// 工具类初始化
public
WifiAdmin(Context context) {
// 取得WifiManager对象
mWifiManager = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
// 取得WifiInfo对象
mWifiInfo = mWifiManager.getConnectionInfo();
}
|
2.开启wifi
1
2
|
//打开wifi
wifiAdmin.openWifi();
|
3.连接热点
1
2
3
4
5
6
7
8
9
10
11
|
//连接热点之前我们需要先扫描周围热点
public
void
connect() {
wifiAdmin.startScan();
new
Thread(
new
Runnable() {
@Override
public
void
run() {
wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo(WifiAdmin.SSID, WifiAdmin.PassWord,
3
));
}
}).start();
}
|
4.关闭Wifi
1
|
wifiAdmin.closeWifi();
|
5.创建热点
1
|
wifiAdmin.createAp();
|
6.关闭热点
1
|
wifiAdmin.closeWifiAp();
|
对于Wifi和Wifi热点的基本使用就这些,重点都在WifiAdmin工具类中,下面在来说说如何使用广播来监听他们的状态改变。
注册广播监听WIFI连接状态改变
1 . 需要的权限
1
2
|
<uses-permission android:name=
"android.permission.ACCESS_WIFI_STATE"
>
<uses-permission android:name=
"android.permission.ACCESS_NETWORK_STATE"
></uses-permission></uses-permission>
|
2 . 注册广播
1
2
3
4
5
6
7
|
<receiver android=
""
name=
".WifiReceiver"
>
<intent-filter>
</action></action></action></intent-filter>
</receiver>
|
3 . 广播接收者
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
31
|
public
class
WifiReceiver
extends
BroadcastReceiver {
@Override
public
void
onReceive(Context context, Intent intent) {
if
(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
NetworkInfo info =intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if
(info.getState().equals(NetworkInfo.State.DISCONNECTED)) {
/**
* wifi断开连接
*/
}
else
if
(info.getState().equals(NetworkInfo.State.CONNECTED)) {
WifiManager wifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
/**
* wifi以连接wifiInfo.getSSID();获取连接的wifi名称
*/
Log.d(
"TAG"
,wifiInfo.getSSID());
}
}
else
if
(intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
//wifi打开与否
int
wifistate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED);
if
(wifistate == WifiManager.WIFI_STATE_DISABLED) {
/**
* 系统关闭wifi
*/
}
else
if
(wifistate == WifiManager.WIFI_STATE_ENABLED) {
/**
* 系统开启wifi
*/
}
}
}
}
|
以上就是根据广播接受者来获取WIFI的状态,下面在来说说监听WIFI热点的状态
1.广播注册(需要注意的是这个Action自动提示里根本就找不到,貌似是被隐藏了起来)
1
2
3
4
5
|
<receiver android:name=
"com.qdzn.home.wifi.WifiApReceiver"
>
<intent-filter>
</action></intent-filter>
</receiver>
|
2 . 广播接收者
1
2
3
4
5
6
7
8
9
10
|
public
class
WifiApReceiver
extends
BroadcastReceiver {
public
void
onReceive(Context context, Intent intent) {
String action = intent.getAction();
if
(
"android.net.wifi.WIFI_AP_STATE_CHANGED"
.equals(action)) {
//便携式热点的状态为:10---正在关闭;11---已关闭;12---正在开启;13---已开启
int
state = intent.getIntExtra(
"wifi_state"
,
0
);
Log.d(
"TAG"
, state +
"---"
);
}
}
}
|