欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Android開(kāi)發(fā)實(shí)踐:WIFI連接功能的封裝

   在上一篇文章《Android開(kāi)發(fā)實(shí)踐:WIFI掃描功能的封裝》介紹了如何利用Andriod的API實(shí)現(xiàn)WIFI的掃描,本文則重點(diǎn)講述一下如何連接WIFI吧,在此,也給出一個(gè)封裝WIFI連接過(guò)程的類(lèi),提供簡(jiǎn)單的接口以供在各個(gè)代碼工程中復(fù)用。

專(zhuān)業(yè)從事成都網(wǎng)站制作、成都網(wǎng)站建設(shè),高端網(wǎng)站制作設(shè)計(jì),微信小程序,網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠(chéng)服務(wù),采用H5建站+CSS3前端渲染技術(shù),成都響應(yīng)式網(wǎng)站建設(shè)公司,讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過(guò)程建立專(zhuān)項(xiàng)小組,與您實(shí)時(shí)在線互動(dòng),隨時(shí)提供解決方案,暢聊想法和感受。

   與WIFI掃描類(lèi)似,WIFI的連接同樣是一個(gè)耗時(shí)的過(guò)程,所以需要放到線程中執(zhí)行,通過(guò)回調(diào)來(lái)通知調(diào)用者連接結(jié)果。該回調(diào)接口的定義如下:

public interface WifiConnectListener {
    public void OnWifiConnectCompleted( boolean isConnected );
}

   從Android的WIFI Setting可以看出,一般添加一個(gè)新的WIFI連接,需要給出三個(gè)信息,一個(gè)是WIFI的SSID,一個(gè)是WIFI的密碼,另一個(gè)是WIFI的加密類(lèi)型,不同的加密方式,連接時(shí)程序中的配置是不同的,這里定義一個(gè)枚舉,給出四種常見(jiàn)的加密類(lèi)型:

public enum SecurityMode {
    OPEN, WEP, WPA, WPA2
}

   Android的WIFI連接過(guò)程,總體上分為三步,第一步,添加網(wǎng)絡(luò)配置,第二步,根據(jù)網(wǎng)絡(luò)配置連接WIFI,第三步,監(jiān)聽(tīng)系統(tǒng)的WIFI連接狀態(tài)消息。下面就直接給出示例代碼,關(guān)鍵的地方都在代碼中注釋了。

package com.example.testwifi;
                     
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.SupplicantState;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
                                                                                                                  
public class WifiConnector {
                                                                                                        
    private static final int WIFI_CONNECT_TIMEOUT = 20; //連接WIFI的超時(shí)時(shí)間
                                                                                                        
    private Context mContext;
    private WifiManager mWifiManager;           
    private Lock mLock;
    private Condition mCondition;
    private WiFiConncetReceiver mWifiConnectReceiver;
    private WifiConnectListener mWifiConnectListener;
    private boolean mIsConnnected = false;
    private int mNetworkID = -1;
              
    //網(wǎng)絡(luò)加密模式
    public enum SecurityMode {
        OPEN, WEP, WPA, WPA2
    }
                      
   //通知連接結(jié)果的監(jiān)聽(tīng)接口
    public interface WifiConnectListener {
        public void OnWifiConnectCompleted( boolean isConnected );
    }
                        
    public WifiConnector( Context context , WifiConnectListener listener ) {
                                                                                                            
        mContext = context;   
                                                                                                            
        mLock = new ReentrantLock();
        mCondition = mLock.newCondition();
        mWifiManager=(WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);   
                                                                                                            
        mWifiConnectReceiver = new WiFiConncetReceiver();  
                                                                                                            
        mWifiConnectListener = listener;
    }
                                                                                                                
    public void connect( final String ssid, final String password, final SecurityMode mode ) {
                                                                                                            
        new Thread(new Runnable() {
                                                                                                                
            @Override
            public void run() {
                                                                                                                    
                //如果WIFI沒(méi)有打開(kāi),則打開(kāi)WIFI
                if( !mWifiManager.isWifiEnabled() ) {
                    mWifiManager.setWifiEnabled(true);
                }
                                                                                                                            
                //注冊(cè)連接結(jié)果監(jiān)聽(tīng)對(duì)象
                mContext.registerReceiver(mWifiConnectReceiver, new IntentFilter(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION));
                                                                                                                    
                //連接指定SSID
                if( !onConnect(ssid,password,mode) ) {
                    mWifiConnectListener.OnWifiConnectCompleted(false);
                }
                else {
                    mWifiConnectListener.OnWifiConnectCompleted(true);
                }
                                                                                                                    
                //刪除注冊(cè)的監(jiān)聽(tīng)類(lèi)對(duì)象
                mContext.unregisterReceiver(mWifiConnectReceiver);         
            }
        }).start();            
    }
                                                                                                        
    protected boolean onConnect( String ssid, String password, SecurityMode mode ) {
                                                                                                            
        //添加新的網(wǎng)絡(luò)配置
        WifiConfiguration cfg = new WifiConfiguration();
        cfg.SSID = "\"" + ssid + "\"";
        if( password !=null && !"".equals(password) ) {
            //這里比較關(guān)鍵,如果是WEP加密方式的網(wǎng)絡(luò),密碼需要放到cfg.wepKeys[0]里面
            if( mode == SecurityMode.WEP ) {
                cfg.wepKeys[0]   = "\"" + password + "\"";
                cfg.wepTxKeyIndex = 0;
            }
            else {
                cfg.preSharedKey = "\"" + password + "\"";
            }                  
        }
        cfg.status = WifiConfiguration.Status.ENABLED;
         
        //添加網(wǎng)絡(luò)配置
        mNetworkID = mWifiManager.addNetwork(cfg);
                                                                                                            
        mLock.lock();
                                                                                 
        mIsConnnected = false;
            
        //連接該網(wǎng)絡(luò)
        if( !mWifiManager.enableNetwork(mNetworkID , true) ) {
            mLock.unlock();
            return false;
        }
                                                                                                            
        try {
            //等待連接結(jié)果
            mCondition.await(WIFI_CONNECT_TIMEOUT, TimeUnit.SECONDS);
        }
        catch (InterruptedException e) {
            e.printStackTrace();       
        }
                                                                                                            
        mLock.unlock();
                                                                                                            
        return mIsConnnected;
    }  
                                                                                                        
    //監(jiān)聽(tīng)系統(tǒng)的WIFI連接消息
    protected class WiFiConncetReceiver extends BroadcastReceiver {
                                                                                                                    
        @Override
        public void onReceive(Context context, Intent intent) {
                                                                                                                
            if (!WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(intent.getAction())) {
                return;
            }          
                                                                                                                
            mLock.lock();
                                                                                                                
            WifiInfo info = mWifiManager.getConnectionInfo();
            if ( info.getNetworkId()==mNetworkID && info.getSupplicantState() == SupplicantState.COMPLETED ) {
                mIsConnnected = true;
                mCondition.signalAll();    
            }
                                                                                                                
            mLock.unlock();
        }
    }
}

   與WIFI掃描的封裝代碼類(lèi)似,這里也用到了Lock和Condition,就是為了阻塞地等待WIFI連接的結(jié)果,保證正確的registerReceiver和unregisterReceiver網(wǎng)絡(luò)連接狀態(tài)監(jiān)聽(tīng)對(duì)象,同時(shí),設(shè)置了WIFI連接超時(shí),防止由于WIFI模塊的問(wèn)題導(dǎo)致界面收不到回調(diào)而長(zhǎng)時(shí)間“卡死”。

   另外,AndroidManifest.xml文件中記得添加權(quán)限支持哦:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

   這個(gè)WIFI連接類(lèi)的封裝就分享到這里啦,希望對(duì)初學(xué)者有幫助,java文件見(jiàn)博文后面的附件,有任何疑問(wèn)歡迎留言或者來(lái)信lujun.hust@gmail.com交流,或者關(guān)注我的新浪微博 @盧_俊 獲取最新的文章和資訊。

附件:http://down.51cto.com/data/2364418

名稱(chēng)欄目:Android開(kāi)發(fā)實(shí)踐:WIFI連接功能的封裝
本文來(lái)源:http://chinadenli.net/article28/geoejp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航軟件開(kāi)發(fā)網(wǎng)站改版網(wǎng)站設(shè)計(jì)公司標(biāo)簽優(yōu)化電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名