Android开发实践:WIFI扫描功能的封装
网上关于Android WIFI模块开发的博文已经很多,这里我也想给出我对WIFI模块编程的一些消化结果,将Android的一些API封装类,方便在各个Android APP中复用,简化程序的开发。
本文先给出一个扫描WIFI功能的封装成类,创建该类对象后,当你简单地调用search()函数后,后台会自动扫描当前的WIFI SSID,并以回调的形式通知你扫描结果,代码如下,需要注意的地方都用注释标注出来了。
packagecom.example.testwifi;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.content.IntentFilter;importandroid.net.wifi.ScanResult;importandroid.net.wifi.WifiManager;publicclassWifiSearcher{privatestaticfinalintWIFI_SEARCH_TIMEOUT=20;//扫描WIFI的超时时间privateContextmContext;privateWifiManagermWifiManager;privateWiFiScanReceivermWifiReceiver;privateLockmLock;privateConditionmCondition;privateSearchWifiListenermSearchWifiListener;privatebooleanmIsWifiScanCompleted=false;publicstaticenumErrorType{SEARCH_WIFI_TIMEOUT,//扫描WIFI超时(一直搜不到结果)NO_WIFI_FOUND,//扫描WIFI结束,没有找到任何WIFI信号}//扫描结果通过该接口返回给CallerpublicinterfaceSearchWifiListener{publicvoidonSearchWifiFailed(ErrorTypeerrorType);publicvoidonSearchWifiSuccess(List<String>results);}publicWifiSearcher(Contextcontext,SearchWifiListenerlistener){mContext=context;mSearchWifiListener=listener;mLock=newReentrantLock();mCondition=mLock.newCondition();mWifiManager=(WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);mWifiReceiver=newWiFiScanReceiver();}publicvoidsearch(){newThread(newRunnable(){@Overridepublicvoidrun(){//如果WIFI没有打开,则打开WIFIif(!mWifiManager.isWifiEnabled()){mWifiManager.setWifiEnabled(true);}//注册接收WIFI扫描结果的监听类对象mContext.registerReceiver(mWifiReceiver,newIntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));//开始扫描mWifiManager.startScan();mLock.lock();//阻塞等待扫描结果try{mIsWifiScanCompleted=false;mCondition.await(WIFI_SEARCH_TIMEOUT,TimeUnit.SECONDS);if(!mIsWifiScanCompleted){mSearchWifiListener.onSearchWifiFailed(ErrorType.SEARCH_WIFI_TIMEOUT);}}catch(InterruptedExceptione){e.printStackTrace();}mLock.unlock();//删除注册的监听类对象mContext.unregisterReceiver(mWifiReceiver);}}).start();}//系统WIFI扫描结果消息的接收者protectedclassWiFiScanReceiverextendsBroadcastReceiver{publicvoidonReceive(Contextc,Intentintent){//提取扫描结果List<String>ssidResults=newArrayList<String>();List<ScanResult>scanResults=mWifiManager.getScanResults();for(ScanResultresult:scanResults){ssidResults.add(result.SSID);}//检测扫描结果if(ssidResults.isEmpty()){mSearchWifiListener.onSearchWifiFailed(ErrorType.NO_WIFI_FOUND);}else{mSearchWifiListener.onSearchWifiSuccess(ssidResults);}mLock.lock();mIsWifiScanCompleted=true;mCondition.signalAll();mLock.unlock();}}}
代码中用到了Lock和Condition,就是为了阻塞地等待WIFI扫描的结果,以来可以在search函数内部直接完成监听对象的registerReceiver和unregisterReceiver,防止由于某些原因忘记unregisterReceiver导致程序crash,另一方面,针对某些Android系统可能不一定能够及时收到WIFI扫描结果而设置一个超时时间,这样,不至于UI一直长时间地等待WIFI扫描结果而“假死”。
对了,AndroidManifest.xml文件中记得添加权限支持哦:
<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
这个WIFI扫描类就分享到这里啦,希望对初学者有帮助,java文件见博文后面的附件,有任何疑问欢迎留言或者来信lujun.hust@gmail.com交流,或者关注我的新浪微博 @卢_俊 获取最新的文章和资讯。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。