在上一篇文章《Android开发实践:WIFI扫描功能的封装》介绍了如何利用Andriod的API实现WIFI的扫描,本文则重点讲述一下如何连接WIFI吧,在此,也给出一个封装WIFI连接过程的类,提供简单的接口以供在各个代码工程中复用。


与WIFI扫描类似,WIFI的连接同样是一个耗时的过程,所以需要放到线程中执行,通过回调来通知调用者连接结果。该回调接口的定义如下:

publicinterfaceWifiConnectListener{publicvoidOnWifiConnectCompleted(booleanisConnected);}


从Android的WIFI Setting可以看出,一般添加一个新的WIFI连接,需要给出三个信息,一个是WIFI的SSID,一个是WIFI的密码,另一个是WIFI的加密类型,不同的加密方式,连接时程序中的配置是不同的,这里定义一个枚举,给出四种常见的加密类型:


publicenumSecurityMode{OPEN,WEP,WPA,WPA2}


Android的WIFI连接过程,总体上分为三步,第一步,添加网络配置,第二步,根据网络配置连接WIFI,第三步,监听系统的WIFI连接状态消息。下面就直接给出示例代码,关键的地方都在代码中注释了。


packagecom.example.testwifi;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.SupplicantState;importandroid.net.wifi.WifiConfiguration;importandroid.net.wifi.WifiInfo;importandroid.net.wifi.WifiManager;publicclassWifiConnector{privatestaticfinalintWIFI_CONNECT_TIMEOUT=20;//连接WIFI的超时时间privateContextmContext;privateWifiManagermWifiManager;privateLockmLock;privateConditionmCondition;privateWiFiConncetReceivermWifiConnectReceiver;privateWifiConnectListenermWifiConnectListener;privatebooleanmIsConnnected=false;privateintmNetworkID=-1;//网络加密模式publicenumSecurityMode{OPEN,WEP,WPA,WPA2}//通知连接结果的监听接口publicinterfaceWifiConnectListener{publicvoidOnWifiConnectCompleted(booleanisConnected);}publicWifiConnector(Contextcontext,WifiConnectListenerlistener){mContext=context;mLock=newReentrantLock();mCondition=mLock.newCondition();mWifiManager=(WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);mWifiConnectReceiver=newWiFiConncetReceiver();mWifiConnectListener=listener;}publicvoidconnect(finalStringssid,finalStringpassword,finalSecurityModemode){newThread(newRunnable(){@Overridepublicvoidrun(){//如果WIFI没有打开,则打开WIFIif(!mWifiManager.isWifiEnabled()){mWifiManager.setWifiEnabled(true);}//注册连接结果监听对象mContext.registerReceiver(mWifiConnectReceiver,newIntentFilter(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION));//连接指定SSIDif(!onConnect(ssid,password,mode)){mWifiConnectListener.OnWifiConnectCompleted(false);}else{mWifiConnectListener.OnWifiConnectCompleted(true);}//删除注册的监听类对象mContext.unregisterReceiver(mWifiConnectReceiver);}}).start();}protectedbooleanonConnect(Stringssid,Stringpassword,SecurityModemode){//添加新的网络配置WifiConfigurationcfg=newWifiConfiguration();cfg.SSID="\""+ssid+"\"";if(password!=null&&!"".equals(password)){//这里比较关键,如果是WEP加密方式的网络,密码需要放到cfg.wepKeys[0]里面if(mode==SecurityMode.WEP){cfg.wepKeys[0]="\""+password+"\"";cfg.wepTxKeyIndex=0;}else{cfg.preSharedKey="\""+password+"\"";}}cfg.status=WifiConfiguration.Status.ENABLED;//添加网络配置mNetworkID=mWifiManager.addNetwork(cfg);mLock.lock();mIsConnnected=false;//连接该网络if(!mWifiManager.enableNetwork(mNetworkID,true)){mLock.unlock();returnfalse;}try{//等待连接结果mCondition.await(WIFI_CONNECT_TIMEOUT,TimeUnit.SECONDS);}catch(InterruptedExceptione){e.printStackTrace();}mLock.unlock();returnmIsConnnected;}//监听系统的WIFI连接消息protectedclassWiFiConncetReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){if(!WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(intent.getAction())){return;}mLock.lock();WifiInfoinfo=mWifiManager.getConnectionInfo();if(info.getNetworkId()==mNetworkID&&info.getSupplicantState()==SupplicantState.COMPLETED){mIsConnnected=true;mCondition.signalAll();}mLock.unlock();}}}

与WIFI扫描的封装代码类似,这里也用到了Lock和Condition,就是为了阻塞地等待WIFI连接的结果,保证正确的registerReceiver和unregisterReceiver网络连接状态监听对象,同时,设置了WIFI连接超时,防止由于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交流,或者关注我的新浪微博 @卢_俊 获取最新的文章和资讯。


更多相关文章

  1. Android监听ScrollView的滚动事件
  2. Android真机测试 连接本地服务器
  3. Motorola Droid 4 现踪迹,将支持 LTE 移动网络?
  4. android UDP多点广播,并自动建立Socket连接
  5. Android如何降低service被杀死概率
  6. android怎么监听当前应用被卸载
  7. Android显示从网络下载图片偏小的问题
  8. Android仿淘宝添加商品时属性规格popupwindow
  9. Android网络连接状态

随机推荐

  1. Laravel认证原理以及完全自定义认证详解
  2. 基于php解决json_encode中文UNICODE转码
  3. PHP实现的数组和XML文件相互转换功能示例
  4. PHP单元测试PHPUnit简单用法示例
  5. PHP实现微信支付(jsapi支付)和退款(无需
  6. ThinkPHP实现微信支付(jsapi支付)流程教
  7. 使用 Docker 安装 Zabbix,并配置自定义监
  8. uni-app组件-应用简单快速上线
  9. 轮播图,xhr
  10. 完善课堂的案例,将右侧布局实现