zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    使用Cmake生成makefile
    c++模板类(一)理解编译器的编译模板过程
    C++ 模板
    c++/c 获取cpp文件行号跟文件名
    java获取代码调用位置信息
    android获取手机ip
    Cocos2d-html5游戏开发,常用工具集合
    cocos2d-html5基础
    Cocos2d-x-html5之HelloWorld深入分析与调试
    基于ndk_r7_windows编译实现ndk项目,不需要cygwin
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3063630.html
Copyright © 2011-2022 走看看