乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Android中WIFI開發(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)畫的綜合案例。(源碼來(lái)源于網(wǎng)絡(luò),我也忘了。。。經(jīng)本人重構(gòu)、注釋完成!)


      首先,我們還是看一下我們項(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)擊連接后斷開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ō)明一下:
         1.首先,初始化主界面(xml有些復(fù)雜,慢慢理一下就好了,不是什么大問題)接下來(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)聽當(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)聽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)的多人聊天室,希望能幫助到大家!

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(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)論公約

        類似文章 更多