wifi自动连接指定热点

首先,我是参考的这里面的内容,然后就没有新做wifi工具类:http://blog.csdn.net/yuanbohx/article/details/8109042

主要说一下我的处理,声明一个重点:

WifiManager.WIFI_STATE_CHANGED_ACTION

这个消息只有当WIFI网络打开或者关闭(以及两者的进行时,才会广播该事件,而WIFI的打开,与你程序连没连上WIFI,是完全不同的两个概念),wifi状态有五个,只说四个:WIFI_STATE_DISABLED 已经关闭, WIFI_STATE_DISABLING正在关闭, WIFI_STATE_ENABLED已经打开, WIFI_STATE_ENABLING正在打开

而你如果想判断你的WIFI,有没有连到指定的热点上,需要另外注册一个事件,当然有人用

wifianager.getConnectionInfo().getSupplicantState() ==SupplicantState.COMPLETED)

不知道为什么我用这种方式得到的从来都没有是过COMPLETED,所有,我注册了另外一个过滤器,过滤的是ConnectivityManager.CONNECTIVITY_ACTION

public class MainActivity extends Activity {
	
	private TextView showWifi;
	
	private Button connectWifi;
	
	private Button disconnectWifi;
	
	private Button closeWifi;
	
	WifiAdmin wifi;
	
	private String ssid = "lxkf0001";
	private String password = "lxdz8888";
	
	private static final int DISCONNECT_WIFI = 0;
	
	
	/**
	 * WIFI连接处理
	 */
	Handler wifiHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what){
			case DISCONNECT_WIFI:
				// 扫描WIFI热点
				wifi.startScan();
				
				// 判断是否能扫描到指定的WIFI
		    	ScanResult scanWifi = wifi.isExistWifi(ssid);
		    	if(scanWifi == null) {
		    		showWifi.setText("扫描不到指定的WIFI---------------------------------");
		    		break;
		    	}
		    	
		    	// 创建新的WIFIconfig
		    	WifiConfiguration config = wifi.isExistWifiConfig(ssid);
		    	
		    	int networkId = -1;
		    	
		    	if(config == null) {
		    		config = wifi.createWifiInfo(ssid, password, 3);
		    		networkId = wifi.addNetwork(config);
		    	} 
		    	
		    	showWifi.setText("WIFI开始连接---------------------------------");
		    	
		    	//判断WIFI是否连接,如果连接是否为指定的WIFI
		    	if(wifi.getmWifiInfo() == null) { 
		    		wifi.connectWifi(config.networkId);
		    		
		    	} else {
		    		String connectedSSID = wifi.getmWifiInfo().getSSID();
		    		if(connectedSSID.equals(ssid)) break;
	    			// 如果连接的WIFI,不是指定的热点,断�?��接,重新进行连接
	    			wifi.disconnectWifi(wifi.getmWifiInfo().getNetworkId());
	    			if(networkId != -1){
	    				wifi.connectWifi(networkId);
	    			} else {
	    				wifi.connectWifi(config.networkId);
	    			}
		    		
		    	}
		    	wifi.setmWifiInfo(wifi.getmWifiManager().getConnectionInfo());
			}
			
		}
	};
	
	
	/**
	 * 用来监听WIFI连接的打开和关闭
	 */
	private BroadcastReceiver receiver = new BroadcastReceiver(){

		@Override
		public void onReceive(Context context, Intent intent) {
			switch( intent.getAction()) {
			case WifiManager.WIFI_STATE_CHANGED_ACTION:
				switch(wifi.checkState()) {
				case WifiManager.WIFI_STATE_DISABLED:
					showWifi.setText("WIFI已经关闭");
					wifi.openWifi();
					break;
				case WifiManager.WIFI_STATE_DISABLING:
					showWifi.setText("WIFI正在关闭");
					break;
				case WifiManager.WIFI_STATE_ENABLING:
					showWifi.setText("WIFI正在打开");
					break;
				case WifiManager.WIFI_STATE_ENABLED:
					showWifi.setText("WIFI打开成功");
					wifiHandler.sendEmptyMessage(DISCONNECT_WIFI);
					break;
				}
			}
		}
		
	};
	
	/**
	 * 用来监听WIFI是否连接
	 */
	BroadcastReceiver wifiIsConnected = new BroadcastReceiver(){
		@Override
		public void onReceive(Context context, Intent intent) {
			if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
				ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);  
		        if (cm == null) return;  
	            NetworkInfo networkInfo = cm.getActiveNetworkInfo();  
	            if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {  
	            	showWifi.setText("WIFI连接成功---------------------------------");
	            	//  如果连接的wifi和指定的wifi不一样,则重新进行连接
	            	if(!wifi.getmWifiInfo().getSSID().equals(ssid)) {
	            		wifi.disconnectWifi(wifi.getmWifiInfo().getNetworkId());
	            		wifiHandler.sendEmptyMessage(DISCONNECT_WIFI);
	            	}
	            }  
			}
		}
	};
	
	
	
	IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
	
	IntentFilter wifiConnected = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		wifi = new WifiAdmin(this);
		init();
		registerReceiver(receiver, filter);
		registerReceiver(wifiIsConnected, wifiConnected);
	}
	
	private void init() {
		showWifi = (TextView) findViewById(R.id.showWifi);
		connectWifi = (Button) findViewById(R.id.connectWifi);
		connectWifi.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				if(wifi == null) wifi = new WifiAdmin(MainActivity.this);
				wifi.openWifi();
			}
		});
		
		disconnectWifi = (Button)findViewById(R.id.disconnectWifi);
		disconnectWifi.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				WifiInfo scan = wifi.getmWifiInfo();
				if(scan != null) {
					showWifi.setText(" WIFI不存在" + wifi.checkState());
					wifi.disconnectWifi(scan.getNetworkId());
					wifiHandler.sendEmptyMessage(DISCONNECT_WIFI);
				}
			}
		});
		
		closeWifi = (Button) findViewById(R.id.closeWifi);
		closeWifi.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				wifi.closeWifi();
			}
		});
	}


}


我写的代码比较乱,但功能能实现,然后用到的工具类,就是顶上链接里面直接粘过来的,我也贴上

public class WifiAdmin { 
    // 定义WifiManager对象  
    private WifiManager wifiManager; 
    // 定义WifiInfo对象  
    private WifiInfo wifiInfo; 
    // 扫描出的网络连接列表  
    private List<ScanResult> wifiList; 
    // 网络连接列表  
    private List<WifiConfiguration> wifiConfiguration; 
    // 定义一个WifiLock  
    WifiLock mWifiLock; 
    
    /**
     * 没有加密
     */
    public static final int WIFI_NO_PASSWORD = 1;
    
    /**
     * WEP 加密
     */
    public static final int WIFI_PASSWORD_WEP = 2;
    
    /**
     * WPA 加密 
     */
    public static final int WIFI_PASSWORD_WPA = 3;

 
    // 构造器  
    public WifiAdmin(Context context) { 
        // 取得WifiManager对象  
        wifiManager = (WifiManager) context 
                .getSystemService(Context.WIFI_SERVICE); 
        // 取得WifiInfo对象  
        wifiInfo = wifiManager.getConnectionInfo(); 
    } 
 
    // 打开WIFI  
    public void openWifi() { 
        if (!wifiManager.isWifiEnabled()) { 
            wifiManager.setWifiEnabled(true); 
        } 
    } 
 
    // 关闭WIFI  
    public void closeWifi() { 
        if (wifiManager.isWifiEnabled()) { 
            wifiManager.setWifiEnabled(false); 
        } 
    } 
 
    // 检查当前WIFI状态  
    public int checkState() { 
        return wifiManager.getWifiState(); 
    } 
 
    // 锁定WifiLock  
    public void acquireWifiLock() { 
        mWifiLock.acquire(); 
    } 
 
    // 解锁WifiLock  
    public void releaseWifiLock() { 
        // 判断时候锁定  
        if (mWifiLock.isHeld()) { 
            mWifiLock.acquire(); 
        } 
    } 
 
    // 创建一个WifiLock  
    public void creatWifiLock() { 
        mWifiLock = wifiManager.createWifiLock("Test"); 
    } 
 
    // 得到配置好的网络  
    public List<WifiConfiguration> getConfiguration() { 
        return wifiConfiguration; 
    } 
 
    // 指定配置好的网络进行连接  
    public void connectConfiguration(int index) { 
        // 索引大于配置好的网络索引返回  
        if (index > wifiConfiguration.size()) { 
            return; 
        } 
        // 连接配置好的指定ID的网络  
        wifiManager.enableNetwork(wifiConfiguration.get(index).networkId, 
                true); 
    } 
 
    public void startScan() { 
        wifiManager.startScan(); 
        // 得到扫描结果  
        wifiList = wifiManager.getScanResults(); 
        // 得到配置好的网络连接  
        wifiConfiguration = wifiManager.getConfiguredNetworks(); 
    } 
 
    // 得到网络列表  
    public List<ScanResult> getWifiList() { 
        return wifiList; 
    } 
 
    // 查看扫描结果  
    public StringBuilder lookUpScan() { 
        StringBuilder stringBuilder = new StringBuilder(); 
        for (int i = 0; i < wifiList.size(); i++) { 
            stringBuilder 
                    .append("Index_" + new Integer(i + 1).toString() + ":"); 
            // 将ScanResult信息转换成一个字符串包  
            // 其中把包括:BSSID、SSID、capabilities、frequency、level  
            stringBuilder.append((wifiList.get(i)).toString()); 
            stringBuilder.append("/n"); 
        } 
        return stringBuilder; 
    }
 
    // 得到MAC地址  
    public String getMacAddress() { 
        return (wifiInfo == null) ? "NULL" : wifiInfo.getMacAddress(); 
    } 
 
    // 得到接入点的BSSID  
    public String getBSSID() { 
        return (wifiInfo == null) ? "NULL" : wifiInfo.getBSSID(); 
    } 
    
    /**
     * 得到SSID
     * @return
     */
    public String getSSID() {
    	return (wifiInfo == null) ? "NULL" : wifiInfo.getSSID(); 
    }
 
    // 得到IP地址  
    public int getIPAddress() { 
        return (wifiInfo == null) ? 0 : wifiInfo.getIpAddress(); 
    } 
 
    // 得到连接的ID  
    public int getNetworkId() { 
        return (wifiInfo == null) ? 0 : wifiInfo.getNetworkId(); 
    } 
 
    // 得到WifiInfo的所有信息包  
    public String getWifiInfo() { 
        return (wifiInfo == null) ? "NULL" : wifiInfo.toString(); 
    } 
 
    // 添加一个网络并连接  
    public void addNetwork(WifiConfiguration wcg) { 
	 int wcgID = wifiManager.addNetwork(wcg); 
     boolean b =  wifiManager.enableNetwork(wcgID, true); 
     System.out.println("a--" + wcgID);
     System.out.println("b--" + b);
    } 
 
    // 断开指定ID的网络  
    public void disconnectWifi(int netId) { 
        wifiManager.disableNetwork(netId); 
        wifiManager.disconnect(); 
    } 
    
    /**
     * 连接到指定的网络
     * @param netId
     */
    public void connectWifi(int netId) {
    	wifiManager.enableNetwork(netId, true);
    }
 
    //然后是一个实际应用方法,只验证过没有密码的情况:
 
    /**
     * 分为三种情况:1没有密码2用wep加密3用wpa加密
     * @param SSID
     * @param Password
     * @param Type
     * @return
     */
    public WifiConfiguration createWifiInfo(String SSID, String Password, int Type) 
    { 
          WifiConfiguration config = new WifiConfiguration();   
           config.allowedAuthAlgorithms.clear(); 
           config.allowedGroupCiphers.clear(); 
           config.allowedKeyManagement.clear(); 
           config.allowedPairwiseCiphers.clear(); 
           config.allowedProtocols.clear(); 
          config.SSID = "\"" + SSID + "\"";   
          
          WifiConfiguration tempConfig = this.isExistWifiConfig(SSID);           
          if(tempConfig != null) {  
        	  wifiManager.removeNetwork(tempConfig.networkId);  
          }
          
          if(Type == 1) //WIFICIPHER_NOPASS
          { 
               config.wepKeys[0] = ""; 
               config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
               config.wepTxKeyIndex = 0; 
          } 
          if(Type == 2) //WIFICIPHER_WEP
          { 
              config.hiddenSSID = true;
              config.wepKeys[0]= "\""+Password+"\""; 
              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 == 3) //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;   
          }
           return config; 
    } 
    
    /**
     * 是否存在指定的SSID,的WIFIConfig
     * @param SSID
     * @return
     */
    private WifiConfiguration isExistWifiConfig(String SSID)  
    {  
        List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();  
           for (WifiConfiguration existingConfig : existingConfigs)   
           {  
             if (existingConfig.SSID.equals("\""+SSID+"\""))  
             {  
                 return existingConfig;  
             }  
           }  
        return null;   
    }
    
    /**
     * 是否能扫描到指定的WIFI
     * @param SSID
     * @return
     */
    private ScanResult isExistWifi(String SSID) {
    	if(this.wifiList == null || this.wifiList.size() == 0) this.startScan();
    	for(ScanResult scan : this.wifiList) {
    		if(scan.SSID.equals(SSID)) return scan;
    	}
    	return null;
    }
    
    /**
     * 连接到指定WIIF
     * @param SSID
     * @param Password
     * @param Type
     */
    public void connectWifi(String SSID, String Password, int Type) throws ExceptionUtils{
    	// 判断WIFI是否打开, 如果没有打开,则打开它
    	this.openWifi();
    	
    	//判断当前WIFI列表是否为空,如果为空则重新进行扫描
    	if(this.wifiList == null || this.wifiList.size() == 0) {
    		this.startScan();
    	}
    	
    	// 判断是否能扫描到指定的WIFI
    	ScanResult scanWifi = this.isExistWifi(SSID);
    	if(scanWifi == null) {
    		throw new ExceptionUtils(0, "扫描不到指定的WIFI");
    	}
    	
    	// 创建新的WIFIconfig
    	WifiConfiguration config = this.isExistWifiConfig(SSID);
    	
    	
    	if(config == null) {
    		config = this.createWifiInfo(SSID, Password, Type);
    		wifiManager.addNetwork(config);
    	} 
    	
    	//判断WIFI是否连接,如果连接是否为指定的WIFI
    	if(this.wifiInfo == null) { 
    		this.connectWifi(config.networkId);
    	} else {
    		String connectedSSID = this.wifiInfo.getSSID();
    		if(!connectedSSID.equals(SSID)) {
    			// 如果连接的WIFI,不是指定的热点,断开连接,重新进行连接
    			this.disconnectWifi(this.wifiInfo.getNetworkId());
    			this.connectWifi(config.networkId);
    		}
    	}
    }
  
}
//

代码等审核通过之后再传上下载区

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值