Android中WIFI开发总结(二)

来源:互联网 发布:代办申请淘宝直播 编辑:程序博客网 时间:2024/05/22 11:56

 搞了好几天终于有点眉目了,这里接着总结一下Android中WiFi的使用,在前面(http://www.it165.net/pro/html/201312/7978.html)我们已经简单了解了Wifi实际操作中所用到的几个主要类,今天就剖析一个WIFI搜索、创建、关闭、连接及一些简单的动画的综合案例。(源码来源于网络,我也忘了。。。经本人重构、注释完成!)


首先,我们还是看一下我们项目的框架

\
 
MainActivity类:(处理wifi消息,加载UI)

view sourceprint?
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类:


view sourceprint?
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类:


view sourceprint?
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类:

 

view sourceprint?
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热点的多人聊天室,希望能帮助到大家

0 0