wifi 工具代码

来源:互联网 发布:唐诗宋词朗诵软件 编辑:程序博客网 时间:2024/06/08 02:48

功能实现:控制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

0 0