Android 监听wifi总结

功能实现:控制wifi开关,连上某个特定的wifi。


首先先上个wifi工具类,此类转载网上一人,出处不明了。 

 

package rodar.rgs.conference.utils;



import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.net.InetAddress;

import java.util.ArrayList;

import java.util.List;



import android.net.wifi.ScanResult;

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;

	    	}

	        System.out.println(">>>wifiCon=");

	//开启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);

	        }

	        

//	        try {

//	        	//高级选项

//	        	String ip  ="192.168.1.201";

//	        	int networkPrefixLength =24;

//	        	InetAddress intetAddress  = InetAddress.getByName(ip);

//	        	int intIp = inetAddressToInt(intetAddress);  

//	        	String dns = (intIp & 0xFF ) + "." + ((intIp >> 8 ) & 0xFF) + "." + ((intIp >> 16 ) & 0xFF) + ".1";

//	        	setIpAssignment("STATIC", wifiConfig); //"STATIC" or "DHCP" for dynamic setting

//	        	setIpAddress(intetAddress, networkPrefixLength, wifiConfig);

//	        	setGateway(InetAddress.getByName(dns), wifiConfig);

//	        	setDNS(InetAddress.getByName(dns), wifiConfig);

//	        } catch (Exception e) {

//	        	// TODO: handle exception

//	        	e.printStackTrace();

//	        }

	        

	        int netID = wifiManager.addNetwork(wifiConfig);

	    	boolean bRet = wifiManager.enableNetwork(netID, true); 

//	    	wifiManager.updateNetwork(wifiConfig);

	    	

	    	

			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.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 

	        config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 

	     	config.status = WifiConfiguration.Status.ENABLED;  

	     	}

	     	else

	     	{

	     		return null;

	     	}

	     	return config;

	     }

	     

	     

	     

	     

	     

	     /***

	      * Convert a IPv4 address from an InetAddress to an integer

	      * @param inetAddr is an InetAddress corresponding to the IPv4 address

	      * @return the IP address as an integer in network byte order

	      */

	     public static int inetAddressToInt(InetAddress inetAddr)

	             throws IllegalArgumentException {

	         byte [] addr = inetAddr.getAddress();

	         if (addr.length != 4) {

	             throw new IllegalArgumentException("Not an IPv4 address");

	         }

	         return ((addr[3] & 0xff) << 24) | ((addr[2] & 0xff) << 16) |

	                 ((addr[1] & 0xff) << 8) | (addr[0] & 0xff);

	     }

	     

	 	public static void setIpAssignment(String assign, WifiConfiguration wifiConf)throws SecurityException, IllegalArgumentException,NoSuchFieldException, IllegalAccessException {

			setEnumField(wifiConf, assign, "ipAssignment");

		}

	 	

		public static void setEnumField(Object obj, String value, String name) throws SecurityException, NoSuchFieldException,

		IllegalArgumentException, IllegalAccessException {

			Field f = obj.getClass().getField(name);

			f.set(obj, Enum.valueOf((Class<Enum>) f.getType(), value));

		}

		

		public static void setIpAddress(InetAddress addr, int prefixLength,WifiConfiguration wifiConf) throws SecurityException,IllegalArgumentException,

		NoSuchFieldException,IllegalAccessException, NoSuchMethodException,ClassNotFoundException, InstantiationException,InvocationTargetException {

			Object linkProperties = getField(wifiConf, "linkProperties");

			if (linkProperties == null)

				return;

			Class laClass = Class.forName("android.net.LinkAddress");

			Constructor laConstructor = laClass.getConstructor(new Class[] {InetAddress.class, int.class });

			Object linkAddress = laConstructor.newInstance(addr, prefixLength);

			ArrayList mLinkAddresses = (ArrayList) getDeclaredField(linkProperties,"mLinkAddresses");

			mLinkAddresses.clear();

			mLinkAddresses.add(linkAddress);

		}



		public static void setGateway(InetAddress gateway,WifiConfiguration wifiConf) throws SecurityException,IllegalArgumentException,

		NoSuchFieldException,IllegalAccessException, ClassNotFoundException,NoSuchMethodException, InstantiationException,InvocationTargetException {

			Object linkProperties = getField(wifiConf, "linkProperties");

			if (linkProperties == null)

				return;

			Class routeInfoClass = Class.forName("android.net.RouteInfo");

			Constructor routeInfoConstructor = routeInfoClass.getConstructor(new Class[] { InetAddress.class });

			Object routeInfo = routeInfoConstructor.newInstance(gateway);

			ArrayList mRoutes = (ArrayList) getDeclaredField(linkProperties,"mRoutes");

			mRoutes.clear();

			mRoutes.add(routeInfo);

		}



		public static void setDNS(InetAddress dns, WifiConfiguration wifiConf) throws SecurityException, IllegalArgumentException,NoSuchFieldException, IllegalAccessException {

			Object linkProperties = getField(wifiConf, "linkProperties");

			if (linkProperties == null)

				return;

			ArrayList<InetAddress> mDnses = (ArrayList<InetAddress>) getDeclaredField(linkProperties, "mDnses");

			mDnses.clear(); // or add a new dns address , here I just want to replace DNS1

			mDnses.add(dns);

		}

		

		public static Object getField(Object obj, String name) throws SecurityException, NoSuchFieldException,IllegalArgumentException, IllegalAccessException {

			Field f = obj.getClass().getField(name);

			Object out = f.get(obj);

			return out;

		}



		public static Object getDeclaredField(Object obj, String name) throws SecurityException, NoSuchFieldException,IllegalArgumentException, IllegalAccessException {

			Field f = obj.getClass().getDeclaredField(name);

			f.setAccessible(true);

			Object out = f.get(obj);

			return out;

		}

		

//	    public void editStaticWifiConfig(final ScanResult sr,String pwd, String ip, String gateway,int prefixLength,String dns) throws Exception{        

//	    	WifiConfiguration historyWifiConfig = getHistoryWifiConfig(sr.SSID);

//	    	

//	    	if(historyWifiConfig == null){

//	    		historyWifiConfig = createComWifiConfig(sr.SSID,pwd);

//	    		int netId = mWifiManager.addNetwork(historyWifiConfig);

//	    		mWifiManager.enableNetwork(netId, true);

//	    	}

//	    	

//	        setIpAssignment("STATIC", historyWifiConfig); //"STATIC" or "DHCP" for dynamic setting

//	        setIpAddress(InetAddress.getByName(ip), prefixLength, historyWifiConfig);

//	        setGateway(InetAddress.getByName(gateway), historyWifiConfig);

//	        setDNS(InetAddress.getByName(dns), historyWifiConfig);

//	        

//	        mWifiManager.updateNetwork(historyWifiConfig); //apply the setting

//		}

//	    

//	    public void editDhcpWifiConfig(final ScanResult sr,String pwd) throws Exception{        

//	    	WifiConfiguration historyWifiConfig = getHistoryWifiConfig(sr.SSID);

//	    	

//	    	if(historyWifiConfig == null){

//	    		historyWifiConfig = createComWifiConfig(sr.SSID,pwd);

//	    		int netId = mWifiManager.addNetwork(historyWifiConfig);

//	    		mWifiManager.enableNetwork(netId, true);

//	    	}

//	    	

//	        setIpAssignment("DHCP", historyWifiConfig); //"STATIC" or "DHCP" for dynamic setting

//	        

//	        mWifiManager.updateNetwork(historyWifiConfig); //apply the setting

//		}

}

类中注释高级选项处,是连接上wifi同时自己设定ip.记得wifiManager.updateNetwork(wifiConfig);

 

类中boolean bRet = wifiManager.enableNetwork(netID, true); 第二个参数true表示如果当前已经有连上一个wifi,要强制连到自己设定的wifi上,此参数必须为true否则连上的还是原来的wifi.


调用此类示例

 

							WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

							WifiConnect wifi = new WifiConnect(wifiManager);

							wifi.Connect("wifiName", "wifipPassword",

									WifiCipherType.WIFICIPHER_WPA);


需要的权限

 

 

    <uses-permission android:name="android.permission.INTERNET" />

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

	



<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />

<uses-permission android:name="android.permission.WAKE_LOCK" />


如何在广播监听wifi的状态

 

广播接收类

 

package rodar.rgs.conference.utils;



import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.net.NetworkInfo;

import android.net.wifi.WifiInfo;

import android.net.wifi.WifiManager;

import android.os.Bundle;

import android.os.Parcelable;

import android.util.Log;



public class WifiStateReceiver extends BroadcastReceiver{



//	0 --> WIFI_STATE_DISABLING

//	1 --> WIFI_STATE_DISABLED

//	2 --> WIFI_STATE_ENABLING

//	3 --> WIFI_STATE_ENABLED

//	4 --> WIFI_STATE_UNKNOWN

	

	

	@Override

	public void onReceive(Context context, Intent intent) {

		// TODO Auto-generated method stub

		Bundle bundle = intent.getExtras();

	      int oldInt = bundle.getInt("previous_wifi_state");

	      int newInt = bundle.getInt("wifi_state");

	      

	      System.out.println(">>>oldInt="+oldInt+",newInt="+newInt);

//	      String oldStr = (oldInt>=0 && oldInt<WIFI_STATES.length) ?WIFI_STATES[oldInt] :"?";

//	      String newStr = (newInt>=0 && oldInt<WIFI_STATES.length) ?WIFI_STATES[newInt] :"?";

//	      Log.e("", "oldS="+oldStr+", newS="+newStr);

//	      if(newInt==WifiManager.WIFI_STATE_DISABLED || newInt==WifiManager.WIFI_STATE_ENABLED) {

//	         onWifiStateChange();  // define this function elsewhere!

//	      } else if(newInt==WifiManager.WIFI_STATE_DISABLING ||

//	                newInt==WifiManager.WIFI_STATE_ENABLING)

//	      {

////	       chkbox_wifi.setText(newStr);

//	      } else {

//	       newStr += " (Is wpa_supplicant.conf readable?)";

////	       chkbox_wifi.setText(newStr);

//	      }

	      

		WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);

		WifiInfo info = wifiManager.getConnectionInfo();

		System.out.println(">>>onReceive.wifiInfo="+info.toString());

		System.out.println(">>>onReceive.SSID="+info.getSSID());

		

//		if(!info.getSSID().equals("Rodar")){

//			WifiConnect wifi = new WifiConnect(wifiManager);

//			wifi.Connect("Rodar", "rodar.5779858",

//					WifiCipherType.WIFICIPHER_WPA);	

//			System.out.println(">>>onReceive.SSID1="+info.getSSID());

//		}

		

		

		 if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction()))

         {

             Parcelable parcelableExtra = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);

             if (null != parcelableExtra)

             {

                 NetworkInfo networkInfo = (NetworkInfo) parcelableExtra;

                 switch (networkInfo.getState())

                 {

                 case CONNECTED:

                     Log.e("APActivity", "CONNECTED");

                     break;

                 case CONNECTING:

                     Log.e("APActivity", "CONNECTING");

                     break;

                 case DISCONNECTED:

                     Log.e("APActivity", "DISCONNECTED");

                     break;

                 case DISCONNECTING:

                     Log.e("APActivity", "DISCONNECTING");

                     break;

                 case SUSPENDED:

                     Log.e("APActivity", "SUSPENDED");

                     break;

                 case UNKNOWN:

                     Log.e("APActivity", "UNKNOWN");

                     break;

                 default:

                     break;

                 }

             }

         }





	}

	

	

	

//	// 显示Wifi状态以及ip地址:

//	public static String StringizeIp(int ip) {

//	  int ip4 = (ip>>24) & 0x000000FF;

//	  int ip3 = (ip>>16) & 0x000000FF;

//	  int ip2 = (ip>> 8 )& 0x000000FF;

//	  int ip1 = ip       & 0x000000FF;

//	  return Integer.toString(ip1) + "." + ip2 + "." + ip3 + "." + ip4;

//	}

//	private void onWifiStateChange() {

//	         String ip_str = "";

//	         WifiInfo info = mMainWifi.getConnectionInfo();

//	         if(info != null) {

//	          int ipaddr = info.getIpAddress();

//	          ip_str = " (ip="+StringizeIp(ipaddr)+")";

//	         }

//	        

//	        if(mMainWifi.isWifiEnabled()==true)

//	               chkbox_wifi.setText("Wifi is on [" + ip_str + "]");

//	        else

//	               chkbox_wifi.setText("Wifi is off");

//	        

//	}

}


注册和取消广播一般在onstart和onstop里

 

 

	WifiStateReceiver wifiStateReceiver;

	@Override

	protected void onStart() {

		//注册网络监听

		wifiStateReceiver = new WifiStateReceiver();

		IntentFilter filter = new IntentFilter();

		filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);

		filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

		registerReceiver(wifiStateReceiver, filter);

		

		super.onStart();

	}



	@Override

	protected void onStop() {

		//注销网络监听

		unregisterReceiver(wifiStateReceiver);

		super.onStop();

	}


关于广播监控wifi开关还是连接状态可以看这个连接

 

http://www.cnblogs.com/wanghafan/archive/2013/01/10/2855096.html

 

你可能感兴趣的:(android)