文章来源:http://blog.csdn.net/swqqcs/article/details/7493374 但是他的wap加密连接不上,参考http://blog.csdn.net/yuanbohx/article/details/8109042,修改wap部分,可以连接上。




通过程序来实现wifi的自动连接。

       这两天对android的wifi功能研究了一下。下面共享出自己封装的WifiConnect类。(这里参考了ZXing开源项目中wifi模块)

       首先,要了解android关于wifi的API.

       如果你喜欢看English API,这是android关于wifi的API地址:

http://developer.android.com/reference/android/net/wifi/package-summary.html(配置Wifi,还需要设定权限,android中关于wifi的API文档中说明了要添加什么权限)

       如果你一看英语就头疼,这里有关于wifi的api的中文解释

http://note.sdo.com/u/1500295617/n/prb71~jGAHfpnM0l000bgN

       切入正题,这里贴出一个封装了的类(WifiConnect),在实例化WifiConnect对象时,需要传入一个WifiManager对象。WifiConnect类向外部提供一个Connect方法,参数是无线的SSID,password,还有加密类型。

package com.example.aptest;

import java.util.List;

import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;

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 的时候才能执行下面的语句  
	        //WifiManager.WIFI_STATE_ENABLING 2
	        //WifiManager.WIFI_STATE_ENABLED 3
	        System.out.println("wifiManager.getWifiState()" + wifiManager.getWifiState());
	        while(wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING )  
	        {  
	        	System.out.println("wifiManager.getWifiState" + wifiManager.getWifiState());
	             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;  
	            
	            //或者下面两段代码也可以
	            // config.hiddenSSID = true;
	            // config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
	        }  
	        else if(Type == WifiCipherType.WIFICIPHER_WEP)  
	        {  
	            config.wepKeys[0] = "\""+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;  
	        }  
	        else 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.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);  
	       config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
	        config.status = WifiConfiguration.Status.ENABLED;    
	        }  
	        else  
	        {  
	            return null;  
	        }  
	        return config;  
	     }
}


<!-- 以下是使用wifi访问网络所需要的权限-->

<manifest ...>
    <uses-feature android:name="android.hardware.wifi" />
    ...
</manifest>




以及:
android.permission.CHANGE_NETWORK_STATE //修改网络状态的权限

android.permission.CHANGE_WIFI_STATE //修改wifi状态的权限

android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.ACCESS_NETWORK_STATE //访问网络权限

android.permission.ACCESS_WIFI_STATE //访问wifi权


Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐