您好,登錄后才能下訂單哦!
網(wǎng)上關(guān)于Android WIFI模塊開發(fā)的博文已經(jīng)很多,這里我也想給出我對WIFI模塊編程的一些消化結(jié)果,將Android的一些API封裝類,方便在各個Android APP中復(fù)用,簡化程序的開發(fā)。
本文先給出一個掃描WIFI功能的封裝成類,創(chuàng)建該類對象后,當(dāng)你簡單地調(diào)用search()函數(shù)后,后臺會自動掃描當(dāng)前的WIFI SSID,并以回調(diào)的形式通知你掃描結(jié)果,代碼如下,需要注意的地方都用注釋標(biāo)注出來了。
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的超時時間 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超時(一直搜不到結(jié)果) NO_WIFI_FOUND, //掃描WIFI結(jié)束,沒有找到任何WIFI信號 } //掃描結(jié)果通過該接口返回給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沒有打開,則打開WIFI if( !mWifiManager.isWifiEnabled() ) { mWifiManager.setWifiEnabled(true); } //注冊接收WIFI掃描結(jié)果的監(jiān)聽類對象 mContext.registerReceiver(mWifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); //開始掃描 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(); //刪除注冊的監(jiān)聽類對象 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); } //檢測掃描結(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é)果,以來可以在search函數(shù)內(nèi)部直接完成監(jiān)聽對象的registerReceiver和unregisterReceiver,防止由于某些原因忘記unregisterReceiver導(dǎo)致程序crash,另一方面,針對某些Android系統(tǒng)可能不一定能夠及時收到WIFI掃描結(jié)果而設(shè)置一個超時時間,這樣,不至于UI一直長時間地等待WIFI掃描結(jié)果而“假死”。
對了,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>
這個WIFI掃描類就分享到這里啦,希望對初學(xué)者有幫助,java文件見博文后面的附件,有任何疑問歡迎留言或者來信lujun.hust@gmail.com交流,或者關(guān)注我的新浪微博 @盧_俊 獲取最新的文章和資訊。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。