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

   網(wǎng)上關(guān)于Android WIFI模塊開(kāi)發(fā)的博文已經(jīng)很多,這里我也想給出我對(duì)WIFI模塊編程的一些消化結(jié)果,將Android的一些API封裝類(lèi),方便在各個(gè)Android APP中復(fù)用,簡(jiǎn)化程序的開(kāi)發(fā)。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),蘇仙企業(yè)網(wǎng)站建設(shè),蘇仙品牌網(wǎng)站建設(shè),網(wǎng)站定制,蘇仙網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,蘇仙網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

   本文先給出一個(gè)掃描WIFI功能的封裝成類(lèi),創(chuàng)建該類(lèi)對(duì)象后,當(dāng)你簡(jiǎn)單地調(diào)用search()函數(shù)后,后臺(tái)會(huì)自動(dòng)掃描當(dāng)前的WIFI SSID,并以回調(diào)的形式通知你掃描結(jié)果,代碼如下,需要注意的地方都用注釋標(biāo)注出來(lái)了。

package com.example.testwifi;
import java.util.ArrayList;
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.ScanResult;
import android.net.wifi.WifiManager;
                                  
public class WifiSearcher {
                                                                                                                                                                                             
    private static final int WIFI_SEARCH_TIMEOUT = 20; //掃描WIFI的超時(shí)時(shí)間
                                                                                                                                                                                             
    private Context mContext;
    private WifiManager mWifiManager;   
    private WiFiScanReceiver mWifiReceiver;      
    private Lock mLock;
    private Condition mCondition;
    private SearchWifiListener mSearchWifiListener;
    private boolean mIsWifiScanCompleted = false;
                                                                                                                                                                                             
    public static enum ErrorType {
        SEARCH_WIFI_TIMEOUT, //掃描WIFI超時(shí)(一直搜不到結(jié)果)
        NO_WIFI_FOUND,       //掃描WIFI結(jié)束,沒(méi)有找到任何WIFI信號(hào)
    }
                                                                                                                                                                                             
    //掃描結(jié)果通過(guò)該接口返回給Caller
    public interface SearchWifiListener {
        public void onSearchWifiFailed(ErrorType errorType);
        public void onSearchWifiSuccess(List<String> results);
    }
                                                                                                                                                                                             
    public WifiSearcher( Context context, SearchWifiListener listener ) {
                                                                                                                                                                                                 
        mContext = context;
        mSearchWifiListener = listener;
                                                                                                                                                                                                 
        mLock = new ReentrantLock();
        mCondition = mLock.newCondition();
        mWifiManager=(WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);     
                                                                                                                                                                                                 
        mWifiReceiver = new WiFiScanReceiver();     
    }
                                                                                                                                                                                   
    public void search() {
                                                                                                                                                                                                 
        new Thread(new Runnable() {
                                                                                                                                                                                                     
            @Override
            public void run() {
                //如果WIFI沒(méi)有打開(kāi),則打開(kāi)WIFI
                if( !mWifiManager.isWifiEnabled() ) {
                    mWifiManager.setWifiEnabled(true);
                }
                                                                                                                                                                                                                 
                //注冊(cè)接收WIFI掃描結(jié)果的監(jiān)聽(tīng)類(lèi)對(duì)象
                mContext.registerReceiver(mWifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
                                                                                                                                                                                                         
                //開(kāi)始掃描
                mWifiManager.startScan();
                                                                                                                                                                                                                        
                mLock.lock();
                                                                                                                                                                                                         
                //阻塞等待掃描結(jié)果
                try {                
                    mIsWifiScanCompleted = false;                
                    mCondition.await(WIFI_SEARCH_TIMEOUT, TimeUnit.SECONDS);
                    if( !mIsWifiScanCompleted ) {
                        mSearchWifiListener.onSearchWifiFailed(ErrorType.SEARCH_WIFI_TIMEOUT);
                    }
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
                                                                                                                                                                                                         
                mLock.unlock();
                                                                                                                                                                                                         
                //刪除注冊(cè)的監(jiān)聽(tīng)類(lèi)對(duì)象
                mContext.unregisterReceiver(mWifiReceiver);                          
            }
        }).start();  
    }
                                                                                                                                                                                     
    //系統(tǒng)WIFI掃描結(jié)果消息的接收者      
    protected class WiFiScanReceiver extends BroadcastReceiver {
                                                                                                                                                                                                 
        public void onReceive(Context c, Intent intent) {
                                                                                                                                                                                             
            //提取掃描結(jié)果
            List<String> ssidResults = new ArrayList<String>();
            List<ScanResult> scanResults = mWifiManager.getScanResults();              
            for(ScanResult result : scanResults ) {
                ssidResults.add(result.SSID);    
            }
                                                                                                                                                                                                     
            //檢測(cè)掃描結(jié)果
            if( ssidResults.isEmpty() ) {
                mSearchWifiListener.onSearchWifiFailed(ErrorType.NO_WIFI_FOUND);
            }
            else {
                mSearchWifiListener.onSearchWifiSuccess(ssidResults);
            }
                                                                                                                                                                                                     
            mLock.lock();
            mIsWifiScanCompleted = true;
            mCondition.signalAll();  
            mLock.unlock();
        }
    }
}

   代碼中用到了Lock和Condition,就是為了阻塞地等待WIFI掃描的結(jié)果,以來(lái)可以在search函數(shù)內(nèi)部直接完成監(jiān)聽(tīng)對(duì)象的registerReceiver和unregisterReceiver,防止由于某些原因忘記unregisterReceiver導(dǎo)致程序crash,另一方面,針對(duì)某些Android系統(tǒng)可能不一定能夠及時(shí)收到WIFI掃描結(jié)果而設(shè)置一個(gè)超時(shí)時(shí)間,這樣,不至于UI一直長(zhǎng)時(shí)間地等待WIFI掃描結(jié)果而“假死”。

   對(duì)了,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/2364295

名稱(chēng)欄目:Android開(kāi)發(fā)實(shí)踐:WIFI掃描功能的封裝
瀏覽路徑:http://muchs.cn/article38/iidssp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、品牌網(wǎng)站制作用戶(hù)體驗(yàn)、微信小程序、面包屑導(dǎo)航

廣告

聲明:本網(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)化排名