搞了好几天终于有点眉目了,这里接着总结一下Android中WiFi的使用,在前面(http://www./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. } 貌似有点长。。。简单说明一下: 广播接收者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热点的多人聊天室,希望能帮助到大家! |
|