小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Android中WIFI開(kāi)發(fā)總結(jié)(二)

 WindySky 2016-07-15

   搞了好幾天終于有點(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>


首先,我們還是看一下我們項(xiàng)目的框架


 
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.@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)聽(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.@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) { //搜索線程沒(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.@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)確定開(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.@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)畫(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.@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.//沒(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.@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ō)明一下:
   1.首先,初始化主界面(xml有些復(fù)雜,慢慢理一下就好了,不是什么大問(wèn)題)接下來(lái),處理三個(gè)重要的按鈕事件:右上角的搜索wifi按鈕、中間創(chuàng)建或關(guān)閉熱點(diǎn)按鈕、對(duì)話框中確定按鈕。處理前兩者事件時(shí),需關(guān)注當(dāng)前wifi狀態(tài),若為占用,需彈出提醒對(duì)話框來(lái)根據(jù)當(dāng)前WiFi操作(WFOperateEnum類中定義好了)事件,來(lái)創(chuàng)建、關(guān)閉、搜索等具體事務(wù)。
   2.之所以定義廣播接收者,是為了監(jiān)聽(tīng)當(dāng)wifi狀態(tài)發(fā)生變化時(shí),能夠及時(shí)更新界面

廣播接收者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.@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)聽(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.@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(); //開(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.@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)擊斷開(kāi)處理事件
071.viewHolder.linearLConnectOk.setOnClickListener(new OnClickListener() {
072.@Override
073.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)的多人聊天室,希望能幫助到大家!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多