搞了好幾天終于有點(diǎn)眉目了,這里接著總結(jié)一下Android中WiFi的使用,在前面(http://www./pro/html/201312/7978.html)我們已經(jīng)簡(jiǎn)單了解了Wifi實(shí)際操作中所用到的幾個(gè)主要類,今天就剖析一個(gè)WIFI搜索、創(chuàng)建、關(guān)閉、連接及一些簡(jiǎn)單的動(dòng)畫的綜合案例。(源碼來(lái)源于網(wǎng)絡(luò),我也忘了。。。經(jīng)本人重構(gòu)、注釋完成!)
![]() 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 ; // 搜索超時(shí) 009. public static final int m_nWTScanResult = 1 ; // 搜索到wifi返回結(jié)果 010. public static final int m_nWTConnectResult = 2 ; // 連接上wifi熱點(diǎn) 011. public static final int m_nCreateAPResult = 3 ; // 創(chuàng)建熱點(diǎn)結(jié)果 012. public static final int m_nUserResult = 4 ; // 用戶上線人數(shù)更新命令(待定) 013. public static final int m_nWTConnected = 5 ; // 點(diǎn)擊連接后斷開wifi,3.5秒后刷新adapter 014. 015. //一些常量 016. public static final String PACKAGE_NAME = "com.zhf.wifidemo.wifi" ; //應(yīng)用包名 017. public static final String FIRST_OPEN_KEY = "version" ; //版本號(hào)信息 018. public static final String WIFI_AP_HEADER = "zhf_" ; 019. public static final String WIFI_AP_PASSWORD = "zhf12345" ; 020. //wifi操作事件(枚舉)-->方便彈出對(duì)話框處理事件 021. private int wFOperateEnum = WFOperateEnum.NOTHING; 022. 023. //三個(gè)重要的類 024. public WFSearchProcess m_wtSearchProcess; //WiFi搜索進(jìn)度條線程 025. public WifiAdmin m_wiFiAdmin; //Wifi管理類 026. public CreateAPProcess m_createAPProcess; //創(chuàng)建Wifi熱點(diǎn)線程 027. 028. //相關(guān)控件 029. private WFSearchAnimationFrameLayout m_FrameLWTSearchAnimation; //自定義雷達(dá)動(dòng)畫布局 030. private GifView m_gifRadar; //wifi信號(hào)動(dòng)畫布局 031. 032. 033. 034. private LinearLayout m_linearLCreateAP; //創(chuàng)建熱點(diǎn)View 035. private ProgressBar m_progBarCreatingAP; //創(chuàng)建熱點(diǎn)進(jìn)度條 036. private TextView m_textVPromptAP; //創(chuàng)建熱點(diǎn)進(jìn)度條文字 037. 038. private Button m_btnBack; //左上角返回按鈕 039. private Button m_btnSearchWF; //右上角wifi搜索按鈕 040. private Button m_btnCreateWF; //創(chuàng)建wifi熱點(diǎn) 041. private ListView m_listVWT; //顯示信息 042. 043. private LinearLayout m_LinearLDialog; //提醒對(duì)話框 044. private TextView m_textVContentDialog; //對(duì)話框文本內(nèi)容 045. private Button m_btnConfirmDialog, m_btnCancelDialog; //提醒對(duì)話框上的按鈕 046. 047. private TextView m_textVWTPrompt; //中間文字提示 048. 049. private boolean m_isFirstOpen = true ; //標(biāo)記是否是第一次打開 050. ArrayList<ScanResult> m_listWifi = new ArrayList(); //檢測(cè)到熱點(diǎn)信息列表 051. private WTAdapter m_wTAdapter; //網(wǎng)絡(luò)列表適配器 052. public Handler mHandler = new Handler() { 053. public void handleMessage(android.os.Message msg) { 054. switch (msg.what) { 055. case m_nWifiSearchTimeOut: // 搜索超時(shí) 056. m_wtSearchProcess.stop(); 057. m_FrameLWTSearchAnimation.stopAnimation(); 058. m_listWifi.clear(); //網(wǎng)絡(luò)列表 059. //設(shè)置控件 060. m_textVWTPrompt.setVisibility(View.VISIBLE); 061. m_textVWTPrompt.setText( "需要重新搜索,點(diǎn)右上角重新搜索或創(chuàng)建新的熱點(diǎn)..." ); 062. break ; 063. 064. case m_nWTScanResult: //掃描到結(jié)果 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. //和指定連接熱點(diǎn)比較,將其他的過濾掉! 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. //更新列表,顯示出搜索到的熱點(diǎn) 079. m_wTAdapter.setData(m_listWifi); 080. m_wTAdapter.notifyDataSetChanged(); 081. } 082. } 083. break ; 084. case m_nWTConnectResult: //連接結(jié)果 085. m_wTAdapter.notifyDataSetChanged(); //刷新適配器數(shù)據(jù) 086. break ; 087. case m_nCreateAPResult: //創(chuàng)建wifi熱點(diǎn)結(jié)果 088. m_createAPProcess.stop(); 089. m_progBarCreatingAP.setVisibility(View.GONE); //旋轉(zhuǎn)進(jìn)度條 090. if ((m_wiFiAdmin.getWifiApState() == 3 || m_wiFiAdmin.getWifiApState() == 13 ) && (m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER))) { 091. //設(shè)置控件 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( "熱點(diǎn)創(chuàng)建成功!" + "\n熱點(diǎ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( "熱點(diǎn)創(chuàng)建失敗,您可以重新創(chuàng)建或者搜索其它熱點(diǎn)" ); 103. } 104. break ; 105. case m_nUserResult : 106. //更新用戶上線人數(shù) 107. break ; 108. case m_nWTConnected: //點(diǎn)擊連接后斷開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. //創(chuàng)建Wifi熱點(diǎn) 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. // 監(jiān)聽廣播 133. WIFIBroadcast.ehList.add( this ); 134. 135. /******************************實(shí)例化布局**************************************/ 136. m_linearLCreateAP = (LinearLayout) findViewById(R.id.create_ap_llayout_wt_main); //創(chuàng)建熱點(diǎn)View 137. m_progBarCreatingAP = (ProgressBar) findViewById(R.id.creating_progressBar_wt_main); //創(chuàng)建熱點(diǎn)進(jìn)度條 138. m_textVPromptAP = (TextView) findViewById(R.id.prompt_ap_text_wt_main); //創(chuàng)建熱點(diǎn)進(jìn)度條文字 139. 140. m_FrameLWTSearchAnimation = ((WFSearchAnimationFrameLayout) findViewById(R.id.search_animation_wt_main)); // 搜索時(shí)的動(dòng)畫 141. m_listVWT = ((ListView) findViewById(R.id.wt_list_wt_main)); // 搜索到的熱點(diǎn)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動(dòng)畫 147. //提醒對(duì)話框布局 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(); //相當(dāng)于調(diào)用系統(tǒng)返回鍵,結(jié)束當(dāng)前Activity 159. } 160. }); 161. 162. //右上角搜索熱點(diǎn)按鈕 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.當(dāng)前熱點(diǎn)或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提示對(duì)話框顯示 172. m_textVContentDialog.setText( "是否關(guān)閉當(dāng)前熱點(diǎn)去搜索其他熱點(diǎn)?" ); 173. return ; //跳出此方法,交由對(duì)話框來(lái)處理事件 174. } 175. //2.當(dāng)前沒有熱點(diǎn)或wifi連接著 176. if (!m_wiFiAdmin.mWifiManager.isWifiEnabled()) { //如果wifi沒打開 177. m_wiFiAdmin.OpenWifi(); 178. } 179. m_textVWTPrompt.setVisibility(View.VISIBLE); //中間提示文字 180. m_textVWTPrompt.setText( "正在搜索附近的熱點(diǎn)..." ); 181. m_linearLCreateAP.setVisibility(View.GONE); //創(chuàng)建wifi熱點(diǎn)布局消失 182. m_gifRadar.setVisibility(View.GONE); //熱點(diǎn)連接動(dòng)畫消失 183. m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create); //更改按鈕文字“創(chuàng)建” 184. //開始搜索wifi 185. m_wiFiAdmin.startScan(); 186. m_wtSearchProcess.start(); //開啟搜索線程 187. m_FrameLWTSearchAnimation.startAnimation(); //開啟波紋動(dòng)畫 188. } else { //搜索線程開啟著,再次點(diǎn)擊按鈕 189. //重新啟動(dòng) 190. m_wtSearchProcess.stop(); 191. m_wiFiAdmin.startScan(); //開始搜索wifi 192. m_wtSearchProcess.start(); 193. } 194. } 195. }); 196. 197. //中間創(chuàng)建wifi熱點(diǎn)按鈕 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(), "您的設(shè)備不支持熱點(diǎn)創(chuàng)建!" , Toast.LENGTH_SHORT).show(); 204. return ; 205. } 206. if (m_wiFiAdmin.mWifiManager.isWifiEnabled()) { //目前連著wifi 207. wFOperateEnum = WFOperateEnum.CREATE; //wifi熱點(diǎn)創(chuàng)建事件 208. m_LinearLDialog.setVisibility(View.VISIBLE); //對(duì)話框可用 209. m_textVContentDialog.setText( "創(chuàng)建熱點(diǎn)會(huì)關(guān)閉當(dāng)前的WiFi,確認(rèn)繼續(xù)?" ); 210. return ; 211. } 212. if ((m_wiFiAdmin.getWifiApState() == 3 || m_wiFiAdmin.getWifiApState() == 13 ) 213. && (!m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER))) { //目前連接著其他熱點(diǎn)名 214. wFOperateEnum = WFOperateEnum.CREATE; //wifi熱點(diǎn)創(chuàng)建事件 215. m_LinearLDialog.setVisibility(View.VISIBLE); 216. m_textVContentDialog.setText( "系統(tǒng)熱點(diǎn)被占用,點(diǎn)確定開啟熱點(diǎn)以傳輸文件!" ); 217. return ; 218. } 219. if (((m_wiFiAdmin.getWifiApState() == 3 ) || (m_wiFiAdmin.getWifiApState() == 13 )) 220. && (m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER))) { //目前連接著自己指定的Wifi熱點(diǎn) 221. wFOperateEnum = WFOperateEnum.CLOSE; //wifi熱點(diǎn)關(guān)閉事件 222. m_LinearLDialog.setVisibility(View.VISIBLE); 223. m_textVContentDialog.setText( "關(guān)閉熱點(diǎn)會(huì)中斷當(dāng)前傳輸,您確定這么做?" ); 224. return ; 225. } 226. if (m_wtSearchProcess.running) { 227. m_wtSearchProcess.stop(); //停止線程 228. m_FrameLWTSearchAnimation.stopAnimation(); //停止動(dòng)畫 229. } 230. 231. /******************點(diǎn)擊創(chuàng)建熱點(diǎn)時(shí)沒有連接wifi或熱點(diǎn)的情況*****************************/ 232. //關(guān)閉Wifi 233. m_wiFiAdmin.closeWifi(); 234. //創(chuàng)建熱點(diǎn)(名字,密碼,加密類型,wifi/ap類型) 235. m_wiFiAdmin.createWifiAP(m_wiFiAdmin.createWifiInfo(WIFI_AP_HEADER + getLocalHostName(), WIFI_AP_PASSWORD, 3 , "ap" ), true ); 236. m_createAPProcess.start(); //開啟創(chuàng)建熱點(diǎn)線程 237. 238. //將wifi信息列表設(shè)置到listview中 239. m_listWifi.clear(); 240. m_wTAdapter.setData(m_listWifi); 241. m_wTAdapter.notifyDataSetChanged(); 242. //設(shè)置布局 243. m_linearLCreateAP.setVisibility(View.VISIBLE); //熱點(diǎn)布局可用 244. m_progBarCreatingAP.setVisibility(View.VISIBLE); 245. m_textVPromptAP.setText( "正在創(chuàng)建熱點(diǎn)" ); //進(jìn)度條文字 246. m_btnCreateWF.setVisibility(View.GONE); //點(diǎn)擊一次不可再點(diǎn) 247. m_textVWTPrompt.setVisibility(View.GONE); 248. } 249. }); 250. 251. //對(duì)話框確認(rèn)按鈕 252. m_btnConfirmDialog.setOnClickListener( new OnClickListener() { 253. @Override 254. public void onClick(View v) { 255. m_LinearLDialog.setVisibility(View.GONE); //讓對(duì)話框布局消失 256. switch (wFOperateEnum) { //根據(jù)wifi操作事件 257. case WFOperateEnum.CLOSE: //關(guān)閉wifi熱點(diǎn) 258. //設(shè)置布局 259. m_textVWTPrompt.setVisibility(View.VISIBLE); 260. m_textVWTPrompt.setText( "熱點(diǎn)已關(guān)閉!可以進(jìn)行其他操作了!" ); //中間提醒文字 261. m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create); //按鈕文字改回“創(chuàng)建” 262. m_gifRadar.setVisibility(View.GONE); //熱點(diǎn)動(dòng)畫停止 263. m_linearLCreateAP.setVisibility(View.GONE); //下部創(chuàng)建熱點(diǎn)布局不可用 264. 265. //關(guān)閉熱點(diǎn) 266. m_wiFiAdmin.createWifiAP(m_wiFiAdmin.createWifiInfo(m_wiFiAdmin.getApSSID(), "zhf123456" , 3 , "ap" ), false ); 267. break ; 268. case WFOperateEnum.CREATE: //創(chuàng)建wifi熱點(diǎn) 269. if (m_wtSearchProcess.running) { 270. m_wtSearchProcess.stop(); //搜索wifi線程停止 271. m_FrameLWTSearchAnimation.stopAnimation(); //搜索wifi動(dòng)畫停止 272. } 273. //關(guān)閉wifi 274. m_wiFiAdmin.closeWifi(); 275. //創(chuàng)建WiFi熱點(diǎn) 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. //設(shè)置布局 283. m_linearLCreateAP.setVisibility(View.VISIBLE); 284. m_progBarCreatingAP.setVisibility(View.VISIBLE); //旋轉(zhuǎn)進(jìn)度條 285. m_btnCreateWF.setVisibility(View.GONE); 286. m_textVWTPrompt.setVisibility(View.GONE); 287. m_textVPromptAP.setText( "正在創(chuàng)建熱點(diǎn)..." ); //進(jìn)度條文字 288. break ; 289. case WFOperateEnum.SEARCH: //搜索可用熱點(diǎn) 290. //設(shè)置布局 291. m_textVWTPrompt.setVisibility(View.VISIBLE); 292. m_textVWTPrompt.setText( "正在搜索附近的熱點(diǎn)..." ); 293. m_linearLCreateAP.setVisibility(View.GONE); //創(chuàng)建熱點(diǎn)布局不可用 294. m_btnCreateWF.setVisibility(View.VISIBLE); 295. m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create); //按鈕文字改回“創(chuàng)建” 296. m_gifRadar.setVisibility(View.GONE); //熱點(diǎn)動(dòng)畫停止 297. m_linearLCreateAP.setVisibility(View.GONE); //下部創(chuàng)建熱點(diǎn)布局不可用 298. 299. //搜索熱點(diǎn)線程關(guān)閉 300. if (m_createAPProcess.running) 301. m_createAPProcess.stop(); 302. //關(guān)閉熱點(diǎn) 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. //對(duì)話框取消按鈕事件 314. m_btnCancelDialog.setOnClickListener( new OnClickListener() { 315. @Override 316. public void onClick(View v) { 317. //對(duì)話框布局消失 318. m_LinearLDialog.setVisibility(View.GONE); 319. } 320. }); 321. } 322. 323. /**Wifi是否連接**/ 324. private boolean isWifiConnect() { 325. boolean isConnect = true ; 326. //用于網(wǎng)絡(luò)連接狀態(tài)的檢測(cè) 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熱點(diǎn)狀態(tài)**/ 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. /**獲取手機(jī)信息**/ 346. public String getLocalHostName() { 347. String str1 = Build.BRAND; //主板 348. String str2 = Build.MODEL; //機(jī)型 349. if (- 1 == str2.toUpperCase().indexOf(str1.toUpperCase())) 350. str2 = str1 + "_" + str2; 351. return str2; 352. } 353. 354. private void init() { 355. //線程是否在運(yùn)行 356. if ( this .m_wtSearchProcess.running || this .m_createAPProcess.running) { 357. return ; 358. } 359. //沒有連接上wifi或者是wifi熱點(diǎn) 360. if (!isWifiConnect() && !getWifiApState()) { 361. m_wiFiAdmin.OpenWifi(); 362. m_wtSearchProcess.start(); //開啟搜索wifi超時(shí)檢測(cè)線程 363. m_wiFiAdmin.startScan(); //開啟搜索wifi 364. //開啟搜索動(dòng)畫 365. m_FrameLWTSearchAnimation.startAnimation(); 366. 367. //設(shè)置控件 368. m_textVWTPrompt.setVisibility(View.VISIBLE); 369. m_textVWTPrompt.setText( " 正在搜索附近的熱點(diǎn)..." ); 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. //設(shè)置控件 379. this .m_textVWTPrompt.setVisibility( 0 ); 380. this .m_textVWTPrompt.setText( "正在搜索附近的熱點(diǎn)..." ); 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. //識(shí)別出自己自定連接的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添加進(jìn)去 391. } 392. } 393. m_wTAdapter.setData(m_listWifi); //將連接的信息添加到listView中 394. m_wTAdapter.notifyDataSetChanged(); 395. } 396. //連接上wifi熱點(diǎn) 397. if (getWifiApState()){ 398. if (m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER)) { 399. //設(shè)置控件 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熱點(diǎ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(); //獲取當(dāng)前wifi狀態(tài) 432. } 433. } 貌似有點(diǎn)長(zhǎng)。。。簡(jiǎn)單說(shuō)明一下: 廣播接收者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. * 監(jiān)聽wifi熱點(diǎn)變化 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熱點(diǎn)結(jié)果的廣播: "android.net.wifi.SCAN_RESULTS" 19. if (intent.getAction().endsWith(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 20. Log.i( "WTScanResults---->掃描到了可用網(wǎng)絡(luò)---->" , "android.net.wifi.SCAN_RESULTS" ); 21. //遍歷通知各個(gè)監(jiān)聽接口 22. for ( int i = 0 ; i < ehList.size(); i++) { 23. ((EventHandler)ehList.get(i)).scanResultsAvaiable(); 24. } 25. 26. //wifi打開或關(guān)閉狀態(tài)變化 "android.net.wifi.WIFI_STATE_CHANGED" 27. } else if (intent.getAction().endsWith(WifiManager.WIFI_STATE_CHANGED_ACTION)) { 28. Log.i( "WTScanResults----->wifi狀態(tài)變化--->" , "android.net.wifi.WIFI_STATE_CHANGED" ); 29. //這里不需要連接一個(gè)SSID(wifi名稱) 30. for ( int j = 0 ; j < ehList.size(); j++) { 31. ((EventHandler)ehList.get(j)).wifiStatusNotification(); 32. } 33. 34. //連接上一個(gè)SSID后發(fā)出的廣播,(注:與android.net.wifi.WIFI_STATE_CHANGED的區(qū)別) 35. } else if (intent.getAction().endsWith(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { 36. Log.i( "WTScanResults----->網(wǎng)絡(luò)狀態(tài)變化---->" , "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. * 事件監(jiān)聽接口 44. * @author ZHF 45. * 46. */ 47. public static abstract interface EventHandler { 48. /**處理連接變化事件**/ 49. public abstract void handleConnectChange(); 50. /**掃描結(jié)果是有效事件**/ 51. public abstract void scanResultsAvaiable(); 52. /**wifi狀態(tài)變化事件**/ 53. public abstract void wifiStatusNotification(); 54. } 55. 56. } 說(shuō)明:監(jiān)聽系統(tǒng)wifi狀態(tài)變化,內(nèi)部定義了一個(gè)事件處理接口,當(dāng)wifi狀態(tài)發(fā)生變化時(shí),讓其實(shí)現(xiàn)類去發(fā)送消息更新界面。 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. * 創(chuàng)建Wifi熱點(diǎn) 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可用 或 熱點(diǎn)可用 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. } 其他類文件具體看源碼,當(dāng)創(chuàng)建一個(gè)熱點(diǎn)成功后,等待其他客戶端搜索 WIFIAdapte類: 001. /** 002. * 網(wǎng)絡(luò)列表適配器 003. * @author ZHF 004. * 005. */ 006. public class WTAdapter extends BaseAdapter { 007. private LayoutInflater mInflater; 008. private List<ScanResult> mList; //掃描到的網(wǎng)絡(luò)結(jié)果列表 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. //新加的一個(gè)函數(shù),用來(lái)更新數(shù)據(jù) 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. //獲取點(diǎn)擊向的掃描結(jié)果 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. //點(diǎn)擊連接處理事件 055. viewHolder.textConnect.setOnClickListener( new OnClickListener() { 056. @Override 057. public void onClick(View v) { 058. //創(chuàng)建wifi網(wǎng)絡(luò) 059. WifiConfiguration localWifiConfiguration = wifiAdmin.createWifiInfo(localScanResult.SSID, MainActivity.WIFI_AP_PASSWORD, 3 , "wt" ); 060. //添加到網(wǎng)絡(luò) 061. wifiAdmin.addNetwork(localWifiConfiguration); 062. //"點(diǎn)擊鏈接"消失,顯示進(jìn)度條, 063. viewHolder.textConnect.setVisibility(View.GONE); 064. viewHolder.progressBConnecting.setVisibility(View.VISIBLE); 065. viewHolder.linearLConnectOk.setVisibility(View.GONE); 066. //點(diǎn)擊后3.5s發(fā)送消息 067. mContext.mHandler.sendEmptyMessageDelayed(mContext.m_nWTConnected, 3500L); 068. } 069. }); 070. // 點(diǎn)擊斷開處理事件 071. viewHolder.linearLConnectOk.setOnClickListener( new OnClickListener() { 072. @Override 073. public void onClick(View v) { 074. //斷開指定wifi熱點(diǎn) 075. wifiAdmin.disconnectWifi(wifiAdmin.getWifiInfo().getNetworkId()); 076. //"斷開連接"消失,進(jìn)度條顯示 077. viewHolder.textConnect.setVisibility(View.GONE); 078. viewHolder.progressBConnecting.setVisibility(View.VISIBLE); 079. viewHolder.linearLConnectOk.setVisibility(View.GONE); 080. //點(diǎn)擊后3.5s發(fā)送消息 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); //顯示熱點(diǎn)名稱 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. } 點(diǎn)擊連接,實(shí)現(xiàn)客戶連接,此時(shí)他們將處于同一網(wǎng)段內(nèi),接下來(lái)就可以自己實(shí)現(xiàn)傳輸數(shù)據(jù),操控等一系列操作了。 在下一篇中我會(huì)繼實(shí)現(xiàn)一個(gè)基于wif熱點(diǎn)的多人聊天室,希望能幫助到大家! |
|