经过程序来实现wifi的自动链接。html
这两天对android的wifi功能研究了一下。下面共享出本身封装的WifiConnect类。(这里参考了ZXing开源项目中wifi模块)java
首先,要了解android关于wifi的API.android
若是你喜欢看English API,这是android关于wifi的API地址:c++
http://developer.android.com/reference/android/net/wifi/package-summary.html(配置Wifi,还须要设定权限,android中关于wifi的API文档中说明了要添加什么权限)
算法
若是你一看英语就头疼,这里有关于wifi的api的中文解释api
http://note.sdo.com/u/1500295617/n/prb71~jGAHfpnM0l000bgN
网络
切入正题,这里贴出一个封装了的类(WifiConnect),在实例化WifiConnect对象时,须要传入一个WifiManager对象。WifiConnect类向外部提供一个Connect方法,参数是无线的SSID,password,还有加密类型。app
- /*
- * WifiConnect.java
- * Author: cscmaker
- */
- package com.wifi.connect;
-
- import java.util.List;
-
- import android.net.wifi.WifiConfiguration;
- import android.net.wifi.WifiManager;
- import android.util.Log;
-
- public class WifiConnect {
-
- WifiManager wifiManager;
-
- //定义几种加密方式,一种是WEP,一种是WPA,还有没有密码的状况
- public enum WifiCipherType
- {
- WIFICIPHER_WEP,WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID
- }
-
- //构造函数
- public WifiConnect(WifiManager wifiManager)
- {
- this.wifiManager = wifiManager;
- }
-
- //打开wifi功能
- private boolean OpenWifi()
- {
- boolean bRet = true;
- if (!wifiManager.isWifiEnabled())
- {
- bRet = wifiManager.setWifiEnabled(true);
- }
- return bRet;
- }
-
- //提供一个外部接口,传入要链接的无线网
- public boolean Connect(String SSID, String Password, WifiCipherType Type)
- {
- if(!this.OpenWifi())
- {
- return false;
- }
- //开启wifi功能须要一段时间(我在手机上测试通常须要1-3秒左右),因此要等到wifi
- //状态变成WIFI_STATE_ENABLED的时候才能执行下面的语句
- while(wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING )
- {
- try{
- //为了不程序一直while循环,让它睡个100毫秒在检测……
- Thread.currentThread();
- Thread.sleep(100);
- }
- catch(InterruptedException ie){
- }
- }
-
- WifiConfiguration wifiConfig = this.CreateWifiInfo(SSID, Password, Type);
- //
- if(wifiConfig == null)
- {
- return false;
- }
-
- WifiConfiguration tempConfig = this.IsExsits(SSID);
-
- if(tempConfig != null)
- {
- wifiManager.removeNetwork(tempConfig.networkId);
- }
-
- int netID = wifiManager.addNetwork(wifiConfig);
- boolean bRet = wifiManager.enableNetwork(netID, false);
- return bRet;
- }
-
- //查看之前是否也配置过这个网络
- private WifiConfiguration IsExsits(String SSID)
- {
- List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();
- for (WifiConfiguration existingConfig : existingConfigs)
- {
- if (existingConfig.SSID.equals("\""+SSID+"\""))
- {
- return existingConfig;
- }
- }
- return null;
- }
-
- private WifiConfiguration CreateWifiInfo(String SSID, String Password, WifiCipherType Type)
- {
- WifiConfiguration config = new WifiConfiguration();
- config.allowedAuthAlgorithms.clear();
- config.allowedGroupCiphers.clear();
- config.allowedKeyManagement.clear();
- config.allowedPairwiseCiphers.clear();
- config.allowedProtocols.clear();
- config.SSID = "\"" + SSID + "\"";
- if(Type == WifiCipherType.WIFICIPHER_NOPASS)
- {
- config.wepKeys[0] = "";
- config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
- config.wepTxKeyIndex = 0;
- }
- if(Type == WifiCipherType.WIFICIPHER_WEP)
- {
- config.preSharedKey = "\""+Password+"\"";
- config.hiddenSSID = true;
- config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
- config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
- config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
- config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
- config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
- config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
- config.wepTxKeyIndex = 0;
- }
- if(Type == WifiCipherType.WIFICIPHER_WPA)
- {
- config.preSharedKey = "\""+Password+"\"";
- config.hiddenSSID = true;
- config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
- config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
- config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
- config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
- config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
- config.status = WifiConfiguration.Status.ENABLED;
- }
- else
- {
- return null;
- }
- return config;
- }
-
- }