Android中WIFI开发总结(二)

 搞了好几天终于有点眉目了,这里接着总结一下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热点的多人聊天室,希望能帮助到大家

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值