wifi热点创建和自动连接

[java]  view plain copy
  1. 1.wifi热点的创建  
  2.    /** 
  3.   * 创建wifi热点 
  4.   * @param ssid 热点信息 
  5.   * @param passwd  密码 
  6.   * @author wanghongbin 
  7.   */  
  8.  public void startWifiAp(Context context, String ssid, String passwd) {  
  9.  //关闭wifi  
  10.  closeWifi();  
  11.  //关闭热点  
  12.  closeWifiAp();  
  13.  //激活热点  
  14.  invokeWifiAp(ssid, passwd);  
  15.  }  
  16.   
  17.        /** 
  18.   * 激活wifi热点 
  19.   * @param ssid 
  20.   * @param passwd 
  21.   * @author wanghongbin 
  22.   */  
  23.  private void invokeWifiAp(String ssid, String passwd) {  
  24.  try {  
  25.  Method method1 = mWifiManager.getClass().getMethod("setWifiApEnabled",  
  26.  WifiConfiguration.classboolean.class);  
  27.  WifiConfiguration netConfig = new WifiConfiguration();  
  28.   
  29.  netConfig.SSID = ssid;  
  30.  netConfig.preSharedKey =   passwd ;  
  31.  //启动热点  
  32.  boolean isSuccess = (Boolean)method1.invoke(mWifiManager, netConfig, true);  
  33.  Log.i(TAG, "whb end startWifiAp isSuccess="+isSuccess);  
  34.  } catch (IllegalArgumentException e) {  
  35.  // TODO Auto-generated catch block  
  36.  e.printStackTrace();  
  37.  Log.i(TAG, "whb end startWifiAp IllegalArgumentException");  
  38.  } catch (IllegalAcces***ception e) {  
  39.  // TODO Auto-generated catch block  
  40.  e.printStackTrace();  
  41.  Log.i(TAG, "whb end startWifiAp IllegalAcces***ception");  
  42.  } catch (InvocationTargetException e) {  
  43.  // TODO Auto-generated catch block  
  44.  e.printStackTrace();  
  45. // onNotifyWifiNotSurpport();  
  46.  Log.i(TAG, "whb end startWifiAp onNotifyWifiNotSurpport");  
  47.  } catch (SecurityException e) {  
  48.  // TODO Auto-generated catch block  
  49.  e.printStackTrace();  
  50.  Log.i(TAG, "whb end startWifiAp SecurityException");  
  51.  } catch (NoSuchMethodException e) {  
  52.  // TODO Auto-generated catch block  
  53.  e.printStackTrace();  
  54.   onNotifyWifiNotSurpport();  
  55.   Log.i(TAG, "whb end startWifiAp NoSuchMethodException");  
  56.  }  
  57.  }  
  58.   
  59.  // 关闭WIFI  
  60.  public void closeWifi() {  
  61.  if (mWifiManager.isWifiEnabled()) {  
  62.  mWifiManager.setWifiEnabled(false);  
  63.  }  
  64.  }   
  65.   
  66.      //作热点之前先关闭wifi热点服务  
  67.  public  void closeWifiAp( ) {  
  68.  if (isWifiApEnabled()) {  
  69.  try {  
  70.  Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");  
  71.  method.setAccessible(true);  
  72.   
  73.  WifiConfiguration config = (WifiConfiguration) method.invoke(mWifiManager);  
  74.   
  75.  Method method2 = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.classboolean.class);  
  76.  method2.invoke(mWifiManager, config, false);  
  77.  } catch (NoSuchMethodException e) {  
  78.  // TODO Auto-generated catch block  
  79.  e.printStackTrace();  
  80.  } catch (IllegalArgumentException e) {  
  81.  // TODO Auto-generated catch block  
  82.  e.printStackTrace();  
  83.  } catch (IllegalAcces***ception e) {  
  84.  // TODO Auto-generated catch block  
  85.  e.printStackTrace();  
  86.  } catch (InvocationTargetException e) {  
  87.  // TODO Auto-generated catch block  
  88.  e.printStackTrace();  
  89.  }  
  90.  }  
  91.  }  
  92.   
  93. 2.连接热点  
  94.     
  95.     /** 
  96.   * 添加一个网络节点并连接 
  97.   * @param ssid   wifi节点名称 
  98.   * @param passwd  密码 
  99.   * @param type  : TYPE_WEP TYPE_WPA 
  100.   */  
  101.  public void addNetwork(Context context, String ssid, String passwd, int type) {  
  102.  closeWifiAp();  
  103.  openWifi();  
  104.   
  105.  mConfig = createWifiInfo(ssid, passwd, type);  
  106.  SSID = ssid;  
  107.  connectToWifiWithConfiguration(mConfig);  
  108.  }  
  109.   
  110.      public static final int WAIT_FOR_SCAN_RESULT = 10 * 1000//10 seconds  
  111.      public static final int WIFI_SCAN_TIMEOUT = 20 * 1000;  
  112.      /** 
  113.       * 连接指定热点 
  114.       * @param config 
  115.       * @return true : 调用函数成功,具体网络状态还得检测 
  116.       * @author wanghongbin  这个函数害死人阿,网上看了半天也没人说,最后是看的源代码里的WifiConnectionTest.java才明白需要等待,步步等待,步步惊心 
  117.       */  
  118.  public boolean connectToWifiWithConfiguration(WifiConfiguration config) {  
  119.          String ssid = config.SSID;  
  120.          config.SSID = "\""+ssid+"\"";  
  121.   
  122.          //If Wifi is not enabled, enable it  
  123.          if (!mWifiManager.isWifiEnabled()) {  
  124.              Log.v(TAG, "Wifi is not enabled, enable it");  
  125.              mWifiManager.setWifiEnabled(true);  
  126.          }  
  127.   
  128.          List<ScanResult> netList = mWifiManager.getScanResults();  
  129.          if (netList == null) {  
  130.              Log.v(TAG, "scan results are null");  
  131.              // if no scan results are available, start active scan  
  132.              mWifiManager.startScan();  
  133.              boolean mScanResultIsAvailable = false;  
  134.              long startTime = System.currentTimeMillis();  
  135.              while (!mScanResultIsAvailable) {  
  136.                  if ((System.currentTimeMillis() - startTime) > WIFI_SCAN_TIMEOUT) {  
  137.                      return false;  
  138.                  }  
  139.                  // wait for the scan results to be available  
  140.                  synchronized (this) {  
  141.                      // wait for the scan result to be available  
  142.                      try {  
  143.                          this.wait(WAIT_FOR_SCAN_RESULT);  
  144.                      } catch (InterruptedException e) {  
  145.                          e.printStackTrace();  
  146.                      }  
  147.                      if ((mWifiManager.getScanResults() == null) ||  
  148.                              (mWifiManager.getScanResults().size() <= 0)) {  
  149.                          continue;  
  150.                      }  
  151.                      mScanResultIsAvailable = true;  
  152.                  }  
  153.              }  
  154.          }  
  155.   
  156.          netList = mWifiManager.getScanResults();  
  157.   
  158.          for (int i = 0; i < netList.size(); i++) {  
  159.              ScanResult sr= netList.get(i);  
  160.              if (sr.SSID.equals(ssid)) {  
  161.                  Log.v(TAG, "found " + ssid + " in the scan result list");  
  162.                  int networkId = mWifiManager.addNetwork(config);  
  163.                  // Connect to network by disabling others.  
  164.                  mWifiManager.enableNetwork(networkId, true);  
  165.                  mWifiManager.saveConfiguration();  
  166.                  mWifiManager.reconnect();  
  167.                  break;  
  168.             }  
  169.          }  
  170.   
  171.          List<WifiConfiguration> netConfList = mWifiManager.getConfiguredNetworks();  
  172.          if (netConfList.size() <= 0) {  
  173.              Log.v(TAG, ssid + " is not available");  
  174.              return false;  
  175.          }  
  176.          return true;  
  177.      }  
  178.   
  179.  public static final int TYPE_NO_PASSWD = 0x11;  
  180.  public static final int TYPE_WEP = 0x12;  
  181.  public static final int TYPE_WPA = 0x13;  
  182.      /** 
  183.   * 连接信息生成配置对象 
  184.   * @param SSID 
  185.   * @param password 
  186.   * @param type 
  187.   * @return 
  188.   * @author wanghongbin 
  189.   */  
  190.  public WifiConfiguration createWifiInfo(String SSID, String password, int type) {  
  191.    
  192.  Log.v(TAG, "whb SSID =" + SSID + "## Password =" + password + "## Type = " + type);  
  193.    
  194.        WifiConfiguration config = new WifiConfiguration();  
  195.   
  196.         config.SSID = SSID;         
  197.   
  198.         clearAll(SSID);  
  199.   
  200.   
  201.   
  202.   
  203.   
  204.         // 分为三种情况:1没有密码2用wep加密3用wpa加密  
  205.   
  206.         if (type == TYPE_NO_PASSWD) {// WIFICIPHER_NOPASS  
  207.   
  208.             config.hiddenSSID = false;  
  209.   
  210.             config.status =  WifiConfiguration.Status.ENABLED;  
  211.   
  212.             config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);  
  213.   
  214.             config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);  
  215.   
  216.             config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);  
  217.   
  218.             config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);  
  219.   
  220.             config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);  
  221.   
  222.             config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);  
  223.   
  224.             config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);  
  225.   
  226.             config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);  
  227.   
  228.             config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);  
  229.   
  230.             config.preSharedKey = null;  
  231.   
  232.         } else if (type == TYPE_WEP) { // WIFICIPHER_WEP  
  233.   
  234.             config.hiddenSSID = true;  
  235.   
  236.             config.wepKeys[0] = "\"" + password + "\"";  
  237.   
  238.             config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);  
  239.   
  240.             config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);  
  241.   
  242.             config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);  
  243.   
  244.             config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);  
  245.   
  246.             config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);  
  247.   
  248.             config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);  
  249.   
  250.             config.wepTxKeyIndex = 0;  
  251.   
  252.         } else if (type == TYPE_WPA) { // WIFICIPHER_WPA  
  253.   
  254.             config.preSharedKey = "\"" + password + "\"";  
  255.   
  256.             config.hiddenSSID = false;  
  257.   
  258.             config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);  
  259.   
  260.             config.priority = 10000;  
  261.   
  262.             config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);  
  263.   
  264.             config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);  
  265.   
  266.             config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);  
  267.   
  268.             config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);  
  269.   
  270.             config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);  
  271.   
  272.             config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);  
  273.   
  274.             config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);  
  275.   
  276.             config.status = WifiConfiguration.Status.ENABLED;  
  277.   
  278.         }  
  279.   
  280.       
  281.   
  282.   
  283.     
  284.  return config;  
  285.  }  
  286.   
  287. 3.很多之前已经连接上的WIFI,配置信息会自动保存,当你关闭---->打开WIFI时就会自动连接,但有时我们并不希望这样处理,解决方法为在打开WIFI之前将以前所保存的信息清除,代码为  
  288. if(isWifiConnect()){  
  289.     WifiInfo info = mWifiManager.getConnectionInfo();  
  290.     mWifiManager.removeNetwork(info.getNetworkId());  
  291.     mWifiManager.saveConfiguration();  
  292.    }  
  293.   或者  
  294.    /** 
  295.   * 移除所有同名节点 
  296.   * @param SSID 
  297.   */  
  298.  private void clearAll(String SSID) {  
  299.  List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();  
  300.  //按照networkId从大到小排序  
  301.  Collections.sort(existingConfigs, new ComparatorConfig());  
  302.  for (WifiConfiguration existingConfig : existingConfigs) {  
  303.  LogHelper.i(TAG,"existingConfig.SSID="+existingConfig.SSID+",netID = "+ existingConfig.networkId);  
  304.  if (existingConfig.SSID.equals("\""+SSID+"\""/*&& existingConfig.preSharedKey.equals("\"" + password + "\"")*/) {  
  305.  mWifiManager.disableNetwork(existingConfig.networkId);  
  306.  mWifiManager.removeNetwork(existingConfig.networkId);  
  307.  }  
  308.  }  
  309.  mWifiManager.saveConfiguration();  
  310.  }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值