1.wifi热点的创建
/** * 创建wifi热点 * @param ssid 热点信息 * @param passwd 密码 * @author wanghongbin */ public void startWifiAp(Context context, String ssid, String passwd) { //关闭wifi closeWifi(); //关闭热点 closeWifiAp(); //激活热点 invokeWifiAp(ssid, passwd); } /** * 激活wifi热点 * @param ssid * @param passwd * @author wanghongbin */ private void invokeWifiAp(String ssid, String passwd) { try { Method method1 = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); WifiConfiguration netConfig = new WifiConfiguration(); netConfig.SSID = ssid; netConfig.preSharedKey = passwd ; //启动热点 boolean isSuccess = (Boolean)method1.invoke(mWifiManager, netConfig, true); Log.i(TAG, "whb end startWifiAp isSuccess="+isSuccess); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.i(TAG, "whb end startWifiAp IllegalArgumentException"); } catch (IllegalAcces***ception e) { // TODO Auto-generated catch block e.printStackTrace(); Log.i(TAG, "whb end startWifiAp IllegalAcces***ception"); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); // onNotifyWifiNotSurpport(); Log.i(TAG, "whb end startWifiAp onNotifyWifiNotSurpport"); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.i(TAG, "whb end startWifiAp SecurityException"); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); onNotifyWifiNotSurpport(); Log.i(TAG, "whb end startWifiAp NoSuchMethodException"); } } // 关闭WIFI public void closeWifi() { if (mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(false); } } //作热点之前先关闭wifi热点服务 public void closeWifiAp( ) { if (isWifiApEnabled()) { try { Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration"); method.setAccessible(true); WifiConfiguration config = (WifiConfiguration) method.invoke(mWifiManager); Method method2 = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); method2.invoke(mWifiManager, config, false); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAcces***ception e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
2.连接热点
/** * 添加一个网络节点并连接 * @param ssid wifi节点名称 * @param passwd 密码 * @param type : TYPE_WEP TYPE_WPA */ public void addNetwork(Context context, String ssid, String passwd, int type) { closeWifiAp(); openWifi(); mConfig = createWifiInfo(ssid, passwd, type); SSID = ssid; connectToWifiWithConfiguration(mConfig); } public static final int WAIT_FOR_SCAN_RESULT = 10 * 1000; //10 seconds public static final int WIFI_SCAN_TIMEOUT = 20 * 1000; /** * 连接指定热点 * @param config * @return true : 调用函数成功,具体网络状态还得检测 * @author wanghongbin 这个函数害死人阿,网上看了半天也没人说,最后是看的源代码里的WifiConnectionTest.java才明白需要等待,步步等待,步步惊心 */ public boolean connectToWifiWithConfiguration(WifiConfiguration config) { String ssid = config.SSID; config.SSID = "\""+ssid+"\""; //If Wifi is not enabled, enable it if (!mWifiManager.isWifiEnabled()) { Log.v(TAG, "Wifi is not enabled, enable it"); mWifiManager.setWifiEnabled(true); } List<ScanResult> netList = mWifiManager.getScanResults(); if (netList == null) { Log.v(TAG, "scan results are null"); // if no scan results are available, start active scan mWifiManager.startScan(); boolean mScanResultIsAvailable = false; long startTime = System.currentTimeMillis(); while (!mScanResultIsAvailable) { if ((System.currentTimeMillis() - startTime) > WIFI_SCAN_TIMEOUT) { return false; } // wait for the scan results to be available synchronized (this) { // wait for the scan result to be available try { this.wait(WAIT_FOR_SCAN_RESULT); } catch (InterruptedException e) { e.printStackTrace(); } if ((mWifiManager.getScanResults() == null) || (mWifiManager.getScanResults().size() <= 0)) { continue; } mScanResultIsAvailable = true; } } } netList = mWifiManager.getScanResults(); for (int i = 0; i < netList.size(); i++) { ScanResult sr= netList.get(i); if (sr.SSID.equals(ssid)) { Log.v(TAG, "found " + ssid + " in the scan result list"); int networkId = mWifiManager.addNetwork(config); // Connect to network by disabling others. mWifiManager.enableNetwork(networkId, true); mWifiManager.saveConfiguration(); mWifiManager.reconnect(); break; } } List<WifiConfiguration> netConfList = mWifiManager.getConfiguredNetworks(); if (netConfList.size() <= 0) { Log.v(TAG, ssid + " is not available"); return false; } return true; } public static final int TYPE_NO_PASSWD = 0x11; public static final int TYPE_WEP = 0x12; public static final int TYPE_WPA = 0x13; /** * 连接信息生成配置对象 * @param SSID * @param password * @param type * @return * @author wanghongbin */ public WifiConfiguration createWifiInfo(String SSID, String password, int type) { Log.v(TAG, "whb SSID =" + SSID + "## Password =" + password + "## Type = " + type); WifiConfiguration config = new WifiConfiguration(); config.SSID = SSID; clearAll(SSID); // 分为三种情况:1没有密码2用wep加密3用wpa加密 if (type == TYPE_NO_PASSWD) {// WIFICIPHER_NOPASS config.hiddenSSID = false; config.status = WifiConfiguration.Status.ENABLED; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); config.allowedProtocols.set(WifiConfiguration.Protocol.RSN); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.preSharedKey = null; } else if (type == TYPE_WEP) { // 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; } else if (type == TYPE_WPA) { // WIFICIPHER_WPA config.preSharedKey = "\"" + password + "\""; config.hiddenSSID = false; config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); config.priority = 10000; 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.allowedProtocols.set(WifiConfiguration.Protocol.RSN); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); config.status = WifiConfiguration.Status.ENABLED; } return config; }
3.很多之前已经连接上的WIFI,配置信息会自动保存,当你关闭---->打开WIFI时就会自动连接,但有时我们并不希望这样处理,解决方法为在打开WIFI之前将以前所保存的信息清除,代码为
if(isWifiConnect()){
WifiInfo info = mWifiManager.getConnectionInfo();
mWifiManager.removeNetwork(info.getNetworkId());
mWifiManager.saveConfiguration();
}
if(isWifiConnect()){
WifiInfo info = mWifiManager.getConnectionInfo();
mWifiManager.removeNetwork(info.getNetworkId());
mWifiManager.saveConfiguration();
}
或者
/** * 移除所有同名节点 * @param SSID */ private void clearAll(String SSID) { List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks(); //按照networkId从大到小排序 Collections.sort(existingConfigs, new ComparatorConfig()); for (WifiConfiguration existingConfig : existingConfigs) { LogHelper.i(TAG,"existingConfig.SSID="+existingConfig.SSID+",netID = "+ existingConfig.networkId); if (existingConfig.SSID.equals("\""+SSID+"\"") /*&& existingConfig.preSharedKey.equals("\"" + password + "\"")*/) { mWifiManager.disableNetwork(existingConfig.networkId); mWifiManager.removeNetwork(existingConfig.networkId); } } mWifiManager.saveConfiguration(); }