|
搞了好幾天終于有點(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)畫(huà)的綜合案例。(源碼來(lái)源于網(wǎng)絡(luò),我也忘了。。。經(jīng)本人重構(gòu)、注釋完成?。?/p>
![]() 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)擊連接后斷開(kāi)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)畫(huà)布局 030.private GifView m_gifRadar; //wifi信號(hào)動(dòng)畫(huà)布局 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)記是否是第一次打開(kāi) 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)比較,將其他的過(guò)濾掉! 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)擊連接后斷開(kāi)wifi,3.5s后刷新 109.m_wTAdapter.notifyDataSetChanged(); 110.break; 111. 112.} 113.}; 114.}; 115.@Override116.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)聽(tīng)廣播 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)畫(huà) 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)畫(huà) 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.@Override157.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.@Override166.public void onClick(View v) { 167.if(!m_wtSearchProcess.running) { //搜索線程沒(méi)有開(kāi)啟 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)前沒(méi)有熱點(diǎn)或wifi連接著 176.if(!m_wiFiAdmin.mWifiManager.isWifiEnabled()) { //如果wifi沒(méi)打開(kāi) 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)畫(huà)消失 183.m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create); //更改按鈕文字“創(chuàng)建” 184.//開(kāi)始搜索wifi 185.m_wiFiAdmin.startScan(); 186.m_wtSearchProcess.start(); //開(kāi)啟搜索線程 187.m_FrameLWTSearchAnimation.startAnimation(); //開(kāi)啟波紋動(dòng)畫(huà) 188.}else {//搜索線程開(kāi)啟著,再次點(diǎn)擊按鈕 189.//重新啟動(dòng) 190.m_wtSearchProcess.stop(); 191.m_wiFiAdmin.startScan(); //開(kāi)始搜索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.@Override201.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)確定開(kāi)啟熱點(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)畫(huà) 229.} 230. 231./******************點(diǎn)擊創(chuàng)建熱點(diǎn)時(shí)沒(méi)有連接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(); //開(kāi)啟創(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.@Override254.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)畫(huà)停止 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)畫(huà)停止 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)畫(huà)停止 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.//打開(kāi)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.@Override316.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.//沒(méi)有連接上wifi或者是wifi熱點(diǎn) 360.if(!isWifiConnect() && !getWifiApState()) { 361.m_wiFiAdmin.OpenWifi(); 362.m_wtSearchProcess.start(); //開(kāi)啟搜索wifi超時(shí)檢測(cè)線程 363.m_wiFiAdmin.startScan(); //開(kāi)啟搜索wifi 364.//開(kāi)啟搜索動(dòng)畫(huà) 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.@Override413.protected void onDestroy() { 414.// TODO Auto-generated method stub 415.super.onDestroy(); 416.WIFIBroadcast.ehList.remove(this); 417.} 418. 419.@Override420.public void handleConnectChange() { 421.Message msg = mHandler.obtainMessage(m_nWTConnectResult); 422.mHandler.sendMessage(msg); 423.} 424.@Override425.public void scanResultsAvaiable() { 426.Message msg = mHandler.obtainMessage(m_nWTScanResult); 427.mHandler.sendMessage(msg); 428.} 429.@Override430.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)聽(tīng)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.@Override17.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)聽(tīng)接口 22.for(int i = 0; i < ehList.size(); i++) { 23.((EventHandler)ehList.get(i)).scanResultsAvaiable(); 24.} 25. 26.//wifi打開(kāi)或關(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)聽(tīng)接口 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)系統(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.@Override22.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(); //開(kāi)啟線程 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.@Override023.public int getCount() { 024.return mList.size(); 025.} 026.@Override027.public Object getItem(int position) { 028.return mList.get(position); 029.} 030.@Override031.public long getItemId(int position) { 032.return position; 033.} 034.@Override035.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.@Override057.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)擊斷開(kāi)處理事件 071.viewHolder.linearLConnectOk.setOnClickListener(new OnClickListener() { 072.@Override073.public void onClick(View v) { 074.//斷開(kāi)指定wifi熱點(diǎn) 075.wifiAdmin.disconnectWifi(wifiAdmin.getWifiInfo().getNetworkId()); 076.//"斷開(kāi)連接"消失,進(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)的多人聊天室,希望能幫助到大家! |
|
|