搞了好几天终于有点眉目了,这里接着总结一下Android中WiFi的使用,在前面(http://www.it165.net/pro/html/201312/7978.html)我们已经简单了解了Wifi实际操作中所用到的几个主要类,今天就剖析一个WIFI搜索、创建、关闭、连接及一些简单的动画的综合案例。(源码来源于网络,我也忘了。。。经本人重构、注释完成!)
首先,我们还是看一下我们项目的框架
MainActivity类:(处理wifi消息,加载UI)
001.
/**
002.
* 主界面
003.
* @author ZHF
004.
*
005.
*/
006.
public
class
MainActivity
extends
Activity
implements
EventHandler{
007.
//消息事件
008.
public
static
final
int
m_nWifiSearchTimeOut =
0
;
// 搜索超时
009.
public
static
final
int
m_nWTScanResult =
1
;
// 搜索到wifi返回结果
010.
public
static
final
int
m_nWTConnectResult =
2
;
// 连接上wifi热点
011.
public
static
final
int
m_nCreateAPResult =
3
;
// 创建热点结果
012.
public
static
final
int
m_nUserResult =
4
;
// 用户上线人数更新命令(待定)
013.
public
static
final
int
m_nWTConnected =
5
;
// 点击连接后断开wifi,3.5秒后刷新adapter
014.
015.
//一些常量
016.
public
static
final
String PACKAGE_NAME =
"com.zhf.wifidemo.wifi"
;
//应用包名
017.
public
static
final
String FIRST_OPEN_KEY =
"version"
;
//版本号信息
018.
public
static
final
String WIFI_AP_HEADER =
"zhf_"
;
019.
public
static
final
String WIFI_AP_PASSWORD =
"zhf12345"
;
020.
//wifi操作事件(枚举)-->方便弹出对话框处理事件
021.
private
int
wFOperateEnum = WFOperateEnum.NOTHING;
022.
023.
//三个重要的类
024.
public
WFSearchProcess m_wtSearchProcess;
//WiFi搜索进度条线程
025.
public
WifiAdmin m_wiFiAdmin;
//Wifi管理类
026.
public
CreateAPProcess m_createAPProcess;
//创建Wifi热点线程
027.
028.
//相关控件
029.
private
WFSearchAnimationFrameLayout m_FrameLWTSearchAnimation;
//自定义雷达动画布局
030.
private
GifView m_gifRadar;
//wifi信号动画布局
031.
032.
033.
034.
private
LinearLayout m_linearLCreateAP;
//创建热点View
035.
private
ProgressBar m_progBarCreatingAP;
//创建热点进度条
036.
private
TextView m_textVPromptAP;
//创建热点进度条文字
037.
038.
private
Button m_btnBack;
//左上角返回按钮
039.
private
Button m_btnSearchWF;
//右上角wifi搜索按钮
040.
private
Button m_btnCreateWF;
//创建wifi热点
041.
private
ListView m_listVWT;
//显示信息
042.
043.
private
LinearLayout m_LinearLDialog;
//提醒对话框
044.
private
TextView m_textVContentDialog;
//对话框文本内容
045.
private
Button m_btnConfirmDialog, m_btnCancelDialog;
//提醒对话框上的按钮
046.
047.
private
TextView m_textVWTPrompt;
//中间文字提示
048.
049.
private
boolean
m_isFirstOpen =
true
;
//标记是否是第一次打开
050.
ArrayList<ScanResult> m_listWifi =
new
ArrayList();
//检测到热点信息列表
051.
private
WTAdapter m_wTAdapter;
//网络列表适配器
052.
public
Handler mHandler =
new
Handler() {
053.
public
void
handleMessage(android.os.Message msg) {
054.
switch
(msg.what) {
055.
case
m_nWifiSearchTimeOut:
// 搜索超时
056.
m_wtSearchProcess.stop();
057.
m_FrameLWTSearchAnimation.stopAnimation();
058.
m_listWifi.clear();
//网络列表
059.
//设置控件
060.
m_textVWTPrompt.setVisibility(View.VISIBLE);
061.
m_textVWTPrompt.setText(
"需要重新搜索,点右上角重新搜索或创建新的热点..."
);
062.
break
;
063.
064.
case
m_nWTScanResult:
//扫描到结果
065.
m_listWifi.clear();
066.
if
(m_wiFiAdmin.mWifiManager.getScanResults() !=
null
) {
067.
for
(
int
i =
0
; i < m_wiFiAdmin.mWifiManager.getScanResults().size(); i++) {
068.
ScanResult scanResult = m_wiFiAdmin.mWifiManager.getScanResults().get(i);
069.
//和指定连接热点比较,将其他的过滤掉!
070.
if
(scanResult.SSID.startsWith(WIFI_AP_HEADER)) {
071.
m_listWifi.add(scanResult);
072.
}
073.
}
074.
if
(m_listWifi.size() >
0
) {
075.
m_wtSearchProcess.stop();
076.
m_FrameLWTSearchAnimation.stopAnimation();
077.
m_textVWTPrompt.setVisibility(View.GONE);
078.
//更新列表,显示出搜索到的热点
079.
m_wTAdapter.setData(m_listWifi);
080.
m_wTAdapter.notifyDataSetChanged();
081.
}
082.
}
083.
break
;
084.
case
m_nWTConnectResult:
//连接结果
085.
m_wTAdapter.notifyDataSetChanged();
//刷新适配器数据
086.
break
;
087.
case
m_nCreateAPResult:
//创建wifi热点结果
088.
m_createAPProcess.stop();
089.
m_progBarCreatingAP.setVisibility(View.GONE);
//旋转进度条
090.
if
((m_wiFiAdmin.getWifiApState() ==
3
|| m_wiFiAdmin.getWifiApState() ==
13
) && (m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER))) {
091.
//设置控件
092.
m_textVWTPrompt.setVisibility(View.GONE);
093.
m_linearLCreateAP.setVisibility(View.VISIBLE);
094.
m_btnCreateWF.setVisibility(View.VISIBLE);
095.
m_gifRadar.setVisibility(View.VISIBLE);
096.
m_btnCreateWF.setBackgroundResource(R.drawable.x_ap_close);
097.
098.
m_textVPromptAP.setText(
"热点创建成功!"
+
"\n热点名:"
+ m_wiFiAdmin.getApSSID()+
"\n连接密码:zhf12345"
);
099.
}
else
{
100.
m_btnCreateWF.setVisibility(View.VISIBLE);
101.
m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create);
102.
m_textVPromptAP.setText(
"热点创建失败,您可以重新创建或者搜索其它热点"
);
103.
}
104.
break
;
105.
case
m_nUserResult :
106.
//更新用户上线人数
107.
break
;
108.
case
m_nWTConnected:
//点击连接后断开wifi,3.5s后刷新
109.
m_wTAdapter.notifyDataSetChanged();
110.
break
;
111.
112.
}
113.
};
114.
};
115.
@Override
116.
public
void
onCreate(Bundle savedInstanceState) {
117.
super
.onCreate(savedInstanceState);
118.
setContentView(R.layout.wt_main);
119.
//搜索Wifi
120.
m_wtSearchProcess =
new
WFSearchProcess(
this
);
121.
//创建Wifi热点
122.
m_createAPProcess =
new
CreateAPProcess(
this
);
123.
//wifi管理类
124.
m_wiFiAdmin = WifiAdmin.getInstance(
this
);
125.
126.
//初始化View
127.
initView();
128.
}
129.
130.
/**初始化View**/
131.
private
void
initView() {
132.
// 监听广播
133.
WIFIBroadcast.ehList.add(
this
);
134.
135.
/******************************实例化布局**************************************/
136.
m_linearLCreateAP = (LinearLayout) findViewById(R.id.create_ap_llayout_wt_main);
//创建热点View
137.
m_progBarCreatingAP = (ProgressBar) findViewById(R.id.creating_progressBar_wt_main);
//创建热点进度条
138.
m_textVPromptAP = (TextView) findViewById(R.id.prompt_ap_text_wt_main);
//创建热点进度条文字
139.
140.
m_FrameLWTSearchAnimation = ((WFSearchAnimationFrameLayout) findViewById(R.id.search_animation_wt_main));
// 搜索时的动画
141.
m_listVWT = ((ListView) findViewById(R.id.wt_list_wt_main));
// 搜索到的热点listView
142.
//注意此处
143.
m_wTAdapter =
new
WTAdapter(
this
, m_listWifi);
144.
m_listVWT.setAdapter(m_wTAdapter);
145.
m_textVWTPrompt = (TextView) findViewById(R.id.wt_prompt_wt_main);
//中间提醒文字
146.
m_gifRadar = (GifView) findViewById(R.id.radar_gif_wt_main);
//gif动画
147.
//提醒对话框布局
148.
m_LinearLDialog = (LinearLayout) findViewById(R.id.dialog_layout_wt_main);
149.
m_textVContentDialog = (TextView) findViewById(R.id.content_text_wtdialog);
150.
m_btnConfirmDialog = (Button) findViewById(R.id.confirm_btn_wtdialog);
151.
m_btnCancelDialog = (Button) findViewById(R.id.cancel_btn_wtdialog);
152.
153.
//左上角返回键
154.
m_btnBack = (Button) findViewById(R.id.back_btn_wt_main);
155.
m_btnBack.setOnClickListener(
new
OnClickListener() {
156.
@Override
157.
public
void
onClick(View v) {
158.
onBackPressed();
//相当于调用系统返回键,结束当前Activity
159.
}
160.
});
161.
162.
//右上角搜索热点按钮
163.
m_btnSearchWF = (Button) findViewById(R.id.search_btn_wt_main);
164.
m_btnSearchWF.setOnClickListener(
new
OnClickListener() {
165.
@Override
166.
public
void
onClick(View v) {
167.
if
(!m_wtSearchProcess.running) {
//搜索线程没有开启
168.
//1.当前热点或wifi连接着 WIFI_STATE_ENABLED 3 //WIFI_AP_STATE_ENABLED 13
169.
if
(m_wiFiAdmin.getWifiApState() ==
3
|| m_wiFiAdmin.getWifiApState() ==
13
) {
170.
wFOperateEnum = WFOperateEnum.SEARCH;
//搜索wifi事件
171.
m_LinearLDialog.setVisibility(View.VISIBLE);
///wifi提示对话框显示
172.
m_textVContentDialog.setText(
"是否关闭当前热点去搜索其他热点?"
);
173.
return
;
//跳出此方法,交由对话框来处理事件
174.
}
175.
//2.当前没有热点或wifi连接着
176.
if
(!m_wiFiAdmin.mWifiManager.isWifiEnabled()) {
//如果wifi没打开
177.
m_wiFiAdmin.OpenWifi();
178.
}
179.
m_textVWTPrompt.setVisibility(View.VISIBLE);
//中间提示文字
180.
m_textVWTPrompt.setText(
"正在搜索附近的热点..."
);
181.
m_linearLCreateAP.setVisibility(View.GONE);
//创建wifi热点布局消失
182.
m_gifRadar.setVisibility(View.GONE);
//热点连接动画消失
183.
m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create);
//更改按钮文字“创建”
184.
//开始搜索wifi
185.
m_wiFiAdmin.startScan();
186.
m_wtSearchProcess.start();
//开启搜索线程
187.
m_FrameLWTSearchAnimation.startAnimation();
//开启波纹动画
188.
}
else
{
//搜索线程开启着,再次点击按钮
189.
//重新启动
190.
m_wtSearchProcess.stop();
191.
m_wiFiAdmin.startScan();
//开始搜索wifi
192.
m_wtSearchProcess.start();
193.
}
194.
}
195.
});
196.
197.
//中间创建wifi热点按钮
198.
m_btnCreateWF = (Button) findViewById(R.id.create_btn_wt_main);
199.
m_btnCreateWF.setOnClickListener(
new
OnClickListener() {
200.
@Override
201.
public
void
onClick(View v) {
202.
if
(m_wiFiAdmin.getWifiApState() ==
4
) {
// WIFI_STATE_UNKNOWN
203.
Toast.makeText(getApplicationContext(),
"您的设备不支持热点创建!"
, Toast.LENGTH_SHORT).show();
204.
return
;
205.
}
206.
if
(m_wiFiAdmin.mWifiManager.isWifiEnabled()) {
//目前连着wifi
207.
wFOperateEnum = WFOperateEnum.CREATE;
//wifi热点创建事件
208.
m_LinearLDialog.setVisibility(View.VISIBLE);
//对话框可用
209.
m_textVContentDialog.setText(
"创建热点会关闭当前的WiFi,确认继续?"
);
210.
return
;
211.
}
212.
if
((m_wiFiAdmin.getWifiApState() ==
3
|| m_wiFiAdmin.getWifiApState() ==
13
)
213.
&& (!m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER))) {
//目前连接着其他热点名
214.
wFOperateEnum = WFOperateEnum.CREATE;
//wifi热点创建事件
215.
m_LinearLDialog.setVisibility(View.VISIBLE);
216.
m_textVContentDialog.setText(
"系统热点被占用,点确定开启热点以传输文件!"
);
217.
return
;
218.
}
219.
if
(((m_wiFiAdmin.getWifiApState() ==
3
) || (m_wiFiAdmin.getWifiApState() ==
13
))
220.
&& (m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER))) {
//目前连接着自己指定的Wifi热点
221.
wFOperateEnum = WFOperateEnum.CLOSE;
//wifi热点关闭事件
222.
m_LinearLDialog.setVisibility(View.VISIBLE);
223.
m_textVContentDialog.setText(
"关闭热点会中断当前传输,您确定这么做?"
);
224.
return
;
225.
}
226.
if
(m_wtSearchProcess.running) {
227.
m_wtSearchProcess.stop();
//停止线程
228.
m_FrameLWTSearchAnimation.stopAnimation();
//停止动画
229.
}
230.
231.
/******************点击创建热点时没有连接wifi或热点的情况*****************************/
232.
//关闭Wifi
233.
m_wiFiAdmin.closeWifi();
234.
//创建热点(名字,密码,加密类型,wifi/ap类型)
235.
m_wiFiAdmin.createWifiAP(m_wiFiAdmin.createWifiInfo(WIFI_AP_HEADER + getLocalHostName(), WIFI_AP_PASSWORD,
3
,
"ap"
),
true
);
236.
m_createAPProcess.start();
//开启创建热点线程
237.
238.
//将wifi信息列表设置到listview中
239.
m_listWifi.clear();
240.
m_wTAdapter.setData(m_listWifi);
241.
m_wTAdapter.notifyDataSetChanged();
242.
//设置布局
243.
m_linearLCreateAP.setVisibility(View.VISIBLE);
//热点布局可用
244.
m_progBarCreatingAP.setVisibility(View.VISIBLE);
245.
m_textVPromptAP.setText(
"正在创建热点"
);
//进度条文字
246.
m_btnCreateWF.setVisibility(View.GONE);
//点击一次不可再点
247.
m_textVWTPrompt.setVisibility(View.GONE);
248.
}
249.
});
250.
251.
//对话框确认按钮
252.
m_btnConfirmDialog.setOnClickListener(
new
OnClickListener() {
253.
@Override
254.
public
void
onClick(View v) {
255.
m_LinearLDialog.setVisibility(View.GONE);
//让对话框布局消失
256.
switch
(wFOperateEnum) {
//根据wifi操作事件
257.
case
WFOperateEnum.CLOSE:
//关闭wifi热点
258.
//设置布局
259.
m_textVWTPrompt.setVisibility(View.VISIBLE);
260.
m_textVWTPrompt.setText(
"热点已关闭!可以进行其他操作了!"
);
//中间提醒文字
261.
m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create);
//按钮文字改回“创建”
262.
m_gifRadar.setVisibility(View.GONE);
//热点动画停止
263.
m_linearLCreateAP.setVisibility(View.GONE);
//下部创建热点布局不可用
264.
265.
//关闭热点
266.
m_wiFiAdmin.createWifiAP(m_wiFiAdmin.createWifiInfo(m_wiFiAdmin.getApSSID(),
"zhf123456"
,
3
,
"ap"
),
false
);
267.
break
;
268.
case
WFOperateEnum.CREATE:
//创建wifi热点
269.
if
(m_wtSearchProcess.running) {
270.
m_wtSearchProcess.stop();
//搜索wifi线程停止
271.
m_FrameLWTSearchAnimation.stopAnimation();
//搜索wifi动画停止
272.
}
273.
//关闭wifi
274.
m_wiFiAdmin.closeWifi();
275.
//创建WiFi热点
276.
m_wiFiAdmin.createWifiAP(m_wiFiAdmin.createWifiInfo(WIFI_AP_HEADER + getLocalHostName(), WIFI_AP_PASSWORD,
3
,
"ap"
),
true
);
277.
m_createAPProcess.start();
278.
//刷新listView布局
279.
m_listWifi.clear();
280.
m_wTAdapter.setData(m_listWifi);
281.
m_wTAdapter.notifyDataSetChanged();
282.
//设置布局
283.
m_linearLCreateAP.setVisibility(View.VISIBLE);
284.
m_progBarCreatingAP.setVisibility(View.VISIBLE);
//旋转进度条
285.
m_btnCreateWF.setVisibility(View.GONE);
286.
m_textVWTPrompt.setVisibility(View.GONE);
287.
m_textVPromptAP.setText(
"正在创建热点..."
);
//进度条文字
288.
break
;
289.
case
WFOperateEnum.SEARCH:
//搜索可用热点
290.
//设置布局
291.
m_textVWTPrompt.setVisibility(View.VISIBLE);
292.
m_textVWTPrompt.setText(
"正在搜索附近的热点..."
);
293.
m_linearLCreateAP.setVisibility(View.GONE);
//创建热点布局不可用
294.
m_btnCreateWF.setVisibility(View.VISIBLE);
295.
m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create);
//按钮文字改回“创建”
296.
m_gifRadar.setVisibility(View.GONE);
//热点动画停止
297.
m_linearLCreateAP.setVisibility(View.GONE);
//下部创建热点布局不可用
298.
299.
//搜索热点线程关闭
300.
if
(m_createAPProcess.running)
301.
m_createAPProcess.stop();
302.
//关闭热点
303.
m_wiFiAdmin.createWifiAP(m_wiFiAdmin.createWifiInfo(m_wiFiAdmin.getApSSID(), WIFI_AP_PASSWORD,
3
,
"ap"
),
false
);
304.
//打开wifi
305.
m_wiFiAdmin.OpenWifi();
306.
m_wtSearchProcess.start();
307.
m_FrameLWTSearchAnimation.startAnimation();
308.
309.
break
;
310.
}
311.
}
312.
});
313.
//对话框取消按钮事件
314.
m_btnCancelDialog.setOnClickListener(
new
OnClickListener() {
315.
@Override
316.
public
void
onClick(View v) {
317.
//对话框布局消失
318.
m_LinearLDialog.setVisibility(View.GONE);
319.
}
320.
});
321.
}
322.
323.
/**Wifi是否连接**/
324.
private
boolean
isWifiConnect() {
325.
boolean
isConnect =
true
;
326.
//用于网络连接状态的检测
327.
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
328.
if
(!cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected())
329.
isConnect =
false
;
330.
return
isConnect;
331.
}
332.
/**获取wifi热点状态**/
333.
public
boolean
getWifiApState() {
334.
try
{
335.
WifiManager localWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
336.
Method m = localWifiManager.getClass().getMethod(
"getWifiApState"
,
new
Class[
0
]);
337.
int
i = (Integer)(m.invoke(localWifiManager,
new
Object[
0
]));
338.
return
(
3
== i) || (
13
== i);
//WIFI_STATE_ENABLED 3 //WIFI_AP_STATE_ENABLED 13
339.
}
catch
(Exception e) {
340.
e.printStackTrace();
341.
}
342.
return
false
;
343.
}
344.
345.
/**获取手机信息**/
346.
public
String getLocalHostName() {
347.
String str1 = Build.BRAND;
//主板
348.
String str2 = Build.MODEL;
//机型
349.
if
(-
1
== str2.toUpperCase().indexOf(str1.toUpperCase()))
350.
str2 = str1 +
"_"
+ str2;
351.
return
str2;
352.
}
353.
354.
private
void
init() {
355.
//线程是否在运行
356.
if
(
this
.m_wtSearchProcess.running ||
this
.m_createAPProcess.running) {
357.
return
;
358.
}
359.
//没有连接上wifi或者是wifi热点
360.
if
(!isWifiConnect() && !getWifiApState()) {
361.
m_wiFiAdmin.OpenWifi();
362.
m_wtSearchProcess.start();
//开启搜索wifi超时检测线程
363.
m_wiFiAdmin.startScan();
//开启搜索wifi
364.
//开启搜索动画
365.
m_FrameLWTSearchAnimation.startAnimation();
366.
367.
//设置控件
368.
m_textVWTPrompt.setVisibility(View.VISIBLE);
369.
m_textVWTPrompt.setText(
" 正在搜索附近的热点..."
);
370.
m_linearLCreateAP.setVisibility(View.GONE);
371.
m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create);
372.
}
373.
//连接上wifi
374.
if
(isWifiConnect()) {
375.
this
.m_wiFiAdmin.startScan();
376.
this
.m_wtSearchProcess.start();
377.
this
.m_FrameLWTSearchAnimation.startAnimation();
378.
//设置控件
379.
this
.m_textVWTPrompt.setVisibility(
0
);
380.
this
.m_textVWTPrompt.setText(
"正在搜索附近的热点..."
);
381.
this
.m_linearLCreateAP.setVisibility(View.GONE);
382.
this
.m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create);
383.
this
.m_gifRadar.setVisibility(View.GONE);
384.
385.
m_listWifi.clear();
386.
if
(m_wiFiAdmin.mWifiManager.getScanResults() !=
null
) {
387.
for
(
int
i =
0
; i < m_wiFiAdmin.mWifiManager.getScanResults().size(); i++) {
388.
//识别出自己自定连接的wifi
389.
if
(m_wiFiAdmin.mWifiManager.getScanResults().get(i).SSID.startsWith(WIFI_AP_HEADER)) {
390.
m_listWifi.add(m_wiFiAdmin.mWifiManager.getScanResults().get(i));
//将指定wifi添加进去
391.
}
392.
}
393.
m_wTAdapter.setData(m_listWifi);
//将连接的信息添加到listView中
394.
m_wTAdapter.notifyDataSetChanged();
395.
}
396.
//连接上wifi热点
397.
if
(getWifiApState()){
398.
if
(m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER)) {
399.
//设置控件
400.
m_textVWTPrompt.setVisibility(View.GONE);
401.
m_linearLCreateAP.setVisibility(View.VISIBLE);
402.
m_progBarCreatingAP.setVisibility(View.GONE);
403.
m_btnCreateWF.setVisibility(View.VISIBLE);
404.
m_gifRadar.setVisibility(View.VISIBLE);
405.
m_btnCreateWF.setBackgroundResource(R.drawable.x_ap_close);
406.
m_textVPromptAP.setText(
"\n热点名:"
+ m_wiFiAdmin.getApSSID() +
"\n连接密码:zhf12345"
);
407.
}
408.
}
409.
}
410.
}
411.
412.
@Override
413.
protected
void
onDestroy() {
414.
// TODO Auto-generated method stub
415.
super
.onDestroy();
416.
WIFIBroadcast.ehList.remove(
this
);
417.
}
418.
419.
@Override
420.
public
void
handleConnectChange() {
421.
Message msg = mHandler.obtainMessage(m_nWTConnectResult);
422.
mHandler.sendMessage(msg);
423.
}
424.
@Override
425.
public
void
scanResultsAvaiable() {
426.
Message msg = mHandler.obtainMessage(m_nWTScanResult);
427.
mHandler.sendMessage(msg);
428.
}
429.
@Override
430.
public
void
wifiStatusNotification() {
431.
m_wiFiAdmin.mWifiManager.getWifiState();
//获取当前wifi状态
432.
}
433.
}
貌似有点长。。。简单说明一下:
1.首先,初始化主界面(xml有些复杂,慢慢理一下就好了,不是什么大问题)接下来,处理三个重要的按钮事件:右上角的搜索wifi按钮、中间创建或关闭热点按钮、对话框中确定按钮。处理前两者事件时,需关注当前wifi状态,若为占用,需弹出提醒对话框来根据当前WiFi操作(WFOperateEnum类中定义好了)事件,来创建、关闭、搜索等具体事务。
2.之所以定义广播接收者,是为了监听当wifi状态发生变化时,能够及时更新界面
广播接收者WIFIBroadcast类:
01.
package
com.zhf.wifidemo.broadcast;
02.
import
java.util.ArrayList;
03.
import
android.content.BroadcastReceiver;
04.
import
android.content.Context;
05.
import
android.content.Intent;
06.
import
android.net.wifi.WifiManager;
07.
import
android.util.Log;
08.
/**
09.
* 监听wifi热点变化
10.
* @author ZHF
11.
*
12.
*/
13.
public
class
WIFIBroadcast
extends
BroadcastReceiver{
14.
public
static
ArrayList<EventHandler> ehList =
new
ArrayList<EventHandler>();
15.
16.
@Override
17.
public
void
onReceive(Context context, Intent intent) {
18.
//搜索到wifi热点结果的广播: "android.net.wifi.SCAN_RESULTS"
19.
if
(intent.getAction().endsWith(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
20.
Log.i(
"WTScanResults---->扫描到了可用网络---->"
,
"android.net.wifi.SCAN_RESULTS"
);
21.
//遍历通知各个监听接口
22.
for
(
int
i =
0
; i < ehList.size(); i++) {
23.
((EventHandler)ehList.get(i)).scanResultsAvaiable();
24.
}
25.
26.
//wifi打开或关闭状态变化 "android.net.wifi.WIFI_STATE_CHANGED"
27.
}
else
if
(intent.getAction().endsWith(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
28.
Log.i(
"WTScanResults----->wifi状态变化--->"
,
"android.net.wifi.WIFI_STATE_CHANGED"
);
29.
//这里不需要连接一个SSID(wifi名称)
30.
for
(
int
j =
0
; j < ehList.size(); j++) {
31.
((EventHandler)ehList.get(j)).wifiStatusNotification();
32.
}
33.
34.
//连接上一个SSID后发出的广播,(注:与android.net.wifi.WIFI_STATE_CHANGED的区别)
35.
}
else
if
(intent.getAction().endsWith(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
36.
Log.i(
"WTScanResults----->网络状态变化---->"
,
"android.net.wifi.STATE_CHANGE"
);
37.
for
(
int
m =
0
; m < ehList.size(); m++) {
38.
((EventHandler)ehList.get(m)).handleConnectChange();
39.
}
40.
}
41.
}
42.
/**
43.
* 事件监听接口
44.
* @author ZHF
45.
*
46.
*/
47.
public
static
abstract
interface
EventHandler {
48.
/**处理连接变化事件**/
49.
public
abstract
void
handleConnectChange();
50.
/**扫描结果是有效事件**/
51.
public
abstract
void
scanResultsAvaiable();
52.
/**wifi状态变化事件**/
53.
public
abstract
void
wifiStatusNotification();
54.
}
55.
56.
}
说明:监听系统wifi状态变化,内部定义了一个事件处理接口,当wifi状态发生变化时,让其实现类去发送消息更新界面。
CreateAPProcess类:
01.
package
com.zhf.wifidemo.ui;
02.
import
android.net.wifi.WifiManager;
03.
import
android.os.Message;
04.
import
com.zhf.wifidemo.wifi.MainActivity;
05.
/**
06.
* 创建Wifi热点
07.
* @author ZHF
08.
*
09.
*/
10.
public
class
CreateAPProcess
implements
Runnable{
11.
12.
public
MainActivity context;
13.
14.
public
boolean
running =
false
;
15.
private
long
startTime = 0L;
16.
private
Thread thread =
null
;
17.
public
CreateAPProcess(MainActivity context) {
18.
super
();
19.
this
.context = context;
20.
}
21.
@Override
22.
public
void
run() {
23.
while
(
true
) {
24.
if
(!running)
return
;
25.
//WIFI_STATE_ENABLED 3
26.
//WIFI_AP_STATE_ENABLED 13
27.
if
((context.m_wiFiAdmin.getWifiApState() == WifiManager.WIFI_STATE_ENABLED)
28.
|| (context.m_wiFiAdmin.getWifiApState() ==
13
)
29.
|| (System.currentTimeMillis() -
this
.startTime >= 30000L)){
30.
//wifi可用 或 热点可用
31.
Message msg = context.mHandler.obtainMessage(context.m_nCreateAPResult);
32.
context.mHandler.sendMessage(msg);
33.
}
34.
try
{
35.
Thread.sleep(5L);
36.
}
catch
(Exception e) {
37.
e.printStackTrace();
38.
}
39.
}
40.
41.
}
42.
43.
public
void
start() {
44.
try
{
45.
thread =
new
Thread(
this
);
46.
running =
true
;
47.
startTime = System.currentTimeMillis();
48.
thread.start();
//开启线程
49.
}
catch
(Exception e) {
50.
e.printStackTrace();
51.
}
52.
}
53.
54.
public
void
stop() {
55.
try
{
56.
running =
false
;
57.
thread =
null
;
58.
startTime = 0L;
59.
}
catch
(Exception e) {
60.
// TODO: handle exception
61.
}
62.
}
63.
}
其他类文件具体看源码,当创建一个热点成功后,等待其他客户端搜索
上图:
WIFIAdapte类:
001.
/**
002.
* 网络列表适配器
003.
* @author ZHF
004.
*
005.
*/
006.
public
class
WTAdapter
extends
BaseAdapter {
007.
private
LayoutInflater mInflater;
008.
private
List<ScanResult> mList;
//扫描到的网络结果列表
009.
private
MainActivity mContext;
010.
public
WTAdapter(MainActivity context, List<ScanResult> list) {
011.
// TODO Auto-generated constructor stub
012.
this
.mContext = context;
013.
this
.mList = list;
014.
this
.mInflater = LayoutInflater.from(context);
015.
}
016.
//新加的一个函数,用来更新数据
017.
public
void
setData(List<ScanResult> list) {
018.
this
.mList = list;
019.
notifyDataSetChanged();
020.
}
021.
022.
@Override
023.
public
int
getCount() {
024.
return
mList.size();
025.
}
026.
@Override
027.
public
Object getItem(
int
position) {
028.
return
mList.get(position);
029.
}
030.
@Override
031.
public
long
getItemId(
int
position) {
032.
return
position;
033.
}
034.
@Override
035.
public
View getView(
final
int
position, View convertView, ViewGroup parent) {
036.
//获取点击向的扫描结果
037.
final
ScanResult localScanResult = mList.get(position);
038.
//获取wifi类
039.
// final WifiAdmin wifiAdmin = WifiAdmin.getInstance(mContext);
040.
final
WifiAdmin wifiAdmin = mContext.m_wiFiAdmin;
041.
final
ViewHolder viewHolder;
042.
if
(convertView ==
null
) {
043.
viewHolder =
new
ViewHolder();
044.
convertView = mInflater.inflate(R.layout.wtitem,
null
);
045.
//加载布局模板控件
046.
viewHolder.textVName = ((TextView) convertView.findViewById(R.id.name_text_wtitem));
047.
viewHolder.textConnect = ((TextView) convertView.findViewById(R.id.connect_text_wtitem));
048.
viewHolder.linearLConnectOk = ((LinearLayout) convertView.findViewById(R.id.connect_ok_layout_wtitem));
049.
viewHolder.progressBConnecting = ((ProgressBar) convertView.findViewById(R.id.connecting_progressBar_wtitem));
050.
convertView.setTag(viewHolder);
051.
}
else
{
052.
viewHolder = (ViewHolder) convertView.getTag();
053.
}
054.
//点击连接处理事件
055.
viewHolder.textConnect.setOnClickListener(
new
OnClickListener() {
056.
@Override
057.
public
void
onClick(View v) {
058.
//创建wifi网络
059.
WifiConfiguration localWifiConfiguration = wifiAdmin.createWifiInfo(localScanResult.SSID, MainActivity.WIFI_AP_PASSWORD,
3
,
"wt"
);
060.
//添加到网络
061.
wifiAdmin.addNetwork(localWifiConfiguration);
062.
//"点击链接"消失,显示进度条,
063.
viewHolder.textConnect.setVisibility(View.GONE);
064.
viewHolder.progressBConnecting.setVisibility(View.VISIBLE);
065.
viewHolder.linearLConnectOk.setVisibility(View.GONE);
066.
//点击后3.5s发送消息
067.
mContext.mHandler.sendEmptyMessageDelayed(mContext.m_nWTConnected, 3500L);
068.
}
069.
});
070.
// 点击断开处理事件
071.
viewHolder.linearLConnectOk.setOnClickListener(
new
OnClickListener() {
072.
@Override
073.
public
void
onClick(View v) {
074.
//断开指定wifi热点
075.
wifiAdmin.disconnectWifi(wifiAdmin.getWifiInfo().getNetworkId());
076.
//"断开连接"消失,进度条显示
077.
viewHolder.textConnect.setVisibility(View.GONE);
078.
viewHolder.progressBConnecting.setVisibility(View.VISIBLE);
079.
viewHolder.linearLConnectOk.setVisibility(View.GONE);
080.
//点击后3.5s发送消息
081.
mContext.mHandler.sendEmptyMessageDelayed(mContext.m_nWTConnected, 3500L);
082.
}
083.
});
084.
//初始化布局
085.
viewHolder.textConnect.setVisibility(View.GONE);
086.
viewHolder.progressBConnecting.setVisibility(View.GONE);
087.
viewHolder.linearLConnectOk.setVisibility(View.GONE);
088.
viewHolder.textVName.setText(localScanResult.SSID);
//显示热点名称
089.
090.
// 正连接的wifi信息
091.
WifiInfo localWifiInfo = wifiAdmin.getWifiInfo();
092.
if
(localWifiInfo !=
null
) {
093.
try
{
//正在连接
094.
if
((localWifiInfo.getSSID() !=
null
)&& (localWifiInfo.getSSID().equals(localScanResult.SSID))) {
095.
viewHolder.linearLConnectOk.setVisibility(View.VISIBLE);
096.
return
convertView;
097.
}
098.
}
catch
(NullPointerException e) {
099.
e.printStackTrace();
100.
return
convertView;
101.
}
102.
viewHolder.textConnect.setVisibility(View.VISIBLE);
103.
}
104.
return
convertView;
105.
}
106.
public
final
class
ViewHolder {
107.
public
LinearLayout linearLConnectOk;
108.
public
ProgressBar progressBConnecting;
109.
public
TextView textConnect;
110.
public
TextView textVName;
111.
}
112.
}
点击连接,实现客户连接,此时他们将处于同一网段内,接下来就可以自己实现传输数据,操控等一系列操作了。 在下一篇中我会继实现一个基于wif热点的多人聊天室,希望能帮助到大家