我有一個這樣的需求,手機連上一個設備發出的WiFi,然後通過手機端修改設備的WiFi賬號和密碼在進行重連。重連思路是這樣的:修改SSID之後重連,那麼密碼是不變的;修改密碼後重連那麼賬號時不變的,我是這樣實現的
package com.ntk.util; import java.util.List; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.net.wifi.WifiManager.WifiLock; public class WifiAdmin { // 定義WifiManager對象 private WifiManager mWifiManager; // 定義WifiInfo對象 private WifiInfo mWifiInfo; // 掃描出的網絡連接列表 private List<ScanResult> mWifiList; // 網絡連接列表 private List<WifiConfiguration> mWifiConfiguration; // 定義一個WifiLock WifiLock mWifiLock; // 構造器 public WifiAdmin(Context context) { // 取得WifiManager對象 mWifiManager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); // 取得WifiInfo對象 mWifiInfo = mWifiManager.getConnectionInfo(); } // 打開WIFI public void openWifi() { if (!mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(true); } } // 關閉WIFI public void closeWifi() { if (mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(false); } } // 檢查當前WIFI狀態 public int checkState() { return mWifiManager.getWifiState(); } // 鎖定WifiLock public void acquireWifiLock() { mWifiLock.acquire(); } // 解鎖WifiLock public void releaseWifiLock() { // 判斷時候鎖定 if (mWifiLock.isHeld()) { mWifiLock.acquire(); } } // 創建一個WifiLock public void creatWifiLock() { mWifiLock = mWifiManager.createWifiLock("Test"); } // 得到配置好的網絡 public List<WifiConfiguration> getConfiguration() { return mWifiConfiguration; } // 指定配置好的網絡進行連接 public void connectConfiguration(int index) { // 索引大於配置好的網絡索引返回 if (index > mWifiConfiguration.size()) { return; } // 連接配置好的指定ID的網絡 mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, true); } public void startScan() { mWifiManager.startScan(); // 得到掃描結果 mWifiList = mWifiManager.getScanResults(); // 得到配置好的網絡連接 mWifiConfiguration = mWifiManager.getConfiguredNetworks(); } // 得到網絡列表 public List<ScanResult> getWifiList() { return mWifiList; } // 查看掃描結果 public StringBuilder lookUpScan() { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < mWifiList.size(); i++) { stringBuilder .append("Index_" + new Integer(i + 1).toString() + ":"); // 將ScanResult信息轉換成一個字符串包 // 其中把包括:BSSID、SSID、capabilities、frequency、level stringBuilder.append((mWifiList.get(i)).toString()); stringBuilder.append("/n"); } return stringBuilder; } // 得到MAC地址 public String getMacAddress() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress(); } // 得到接入點的BSSID public String getBSSID() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID(); } // 得到IP地址 public int getIPAddress() { return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress(); } // 得到連接的ID public int getNetworkId() { return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId(); } // 得到WifiInfo的所有信息包 public String getWifiInfo() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString(); } // 添加一個網絡並連接 public void addNetwork(WifiConfiguration wcg) { int wcgID = mWifiManager.addNetwork(wcg); boolean b = mWifiManager.enableNetwork(wcgID, true); System.out.println("a--" + wcgID); System.out.println("b--" + b); } // 斷開指定ID的網絡 public void disconnectWifi(int netId) { mWifiManager.disableNetwork(netId); mWifiManager.disconnect(); } //然後是一個實際應用方法,只驗證過沒有密碼的情況: public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type) { WifiConfiguration config = new WifiConfiguration(); config.allowedAuthAlgorithms.clear(); config.allowedGroupCiphers.clear(); config.allowedKeyManagement.clear(); config.allowedPairwiseCiphers.clear(); config.allowedProtocols.clear(); config.SSID = "\"" + SSID + "\""; WifiConfiguration tempConfig = this.IsExsits(SSID); if(tempConfig != null) { mWifiManager.removeNetwork(tempConfig.networkId); } if(Type == 1) //WIFICIPHER_NOPASS { config.wepKeys[0] = ""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } if(Type == 2) //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; } if(Type == 3) //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; } return config; } public WifiConfiguration IsExsits(String SSID) { List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks(); for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("\""+SSID+"\"")) { return existingConfig; } } return null; } }上面是已經封裝好的WiFi工具類可以直接使用,其實重連就是這樣的,移除當前所連接的WiFi,記住當前連接的賬號和密碼所以我的操作是這樣的
wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo(ssid, resultq.get("passphrase").toString(), 3));這裏的關鍵是你要保存之前所連接的SSID或密碼,其實到這裏WiFi重連就已經成功了,但是還會碰到很大的問題,一般我們是修改WiFi後點擊重連,我們肯定不會在這個期間讓用戶操作我們的app了吧,所以我加了個dialog進行等待提示,這裏又有問題,可能我們的WiFi已經重連成功但是我們的等待提示還在執行。這就尷尬了不用慌,加個監聽嗎,上代碼:
private BroadcastReceiver mReceiver = new BroadcastReceiver (){ @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION)){ //signal strength changed } else if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){//wifi連接上與否 System.out.println("網絡狀態改變"); NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if(info.getState().equals(NetworkInfo.State.DISCONNECTED)){ } else if(info.getState().equals(NetworkInfo.State.CONNECTED)){ WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); String ssid = wifiInfo.getSSID(); // setConnect(false); //獲取當前wifi名稱 // Toast.makeText(getApplicationContext(), "網絡連接到"+wifiInfo.getSSID(), Toast.LENGTH_SHORT).show(); if (MyApp.SSID!=null) { deviceVersion = Build.VERSION.SDK_INT; if (deviceVersion >= 17) {//41.系統上的沒有引號 if (ssid.startsWith("\"") && ssid.endsWith("\"")) { ssid = ssid.substring(1, ssid.length() - 1); if (ssid.contains(MyApp.SSID)) { //Toast.makeText(getApplicationContext(), "WiFi網絡連接成功"+ssid+"----:::"+MyApp.SSID+"", Toast.LENGTH_SHORT).show(); setConnect(false); stopClick(chronometer); isConecting = false; textView_camera_info_SSID.setText(MyApp.SSID); // Toast.makeText(getApplicationContext(), "WiFi連接成功", Toast.LENGTH_SHORT).show(); } } } } }直接拿去用不謝,在這個裏面有一點需要注意那就是有的系統你獲取到的SSID會帶上引號,也許到這裏就解決了你的需求,但是我的問題還是沒解決,oh NO是不是在想我的問題到底是什麼~~~你們有沒有想過如果重連時間過長怎麼辦?這是個很大的問題!!!所以我就想到了20秒後給個提示,讓用戶自己手動重連,請看下面:
public class OnChronometerTickListenerImpl implements OnChronometerTickListener { // 計時監聽事件,隨時隨地的監聽時間的變化 @Override public void onChronometerTick(Chronometer chronometer2) { String time2 = chronometer2.getText().toString(); Log.e("aaaaaaaaa : ", time2); if ("00:00:20".equals(time2)) { setConnect(false); stopClick(chronometer); backWifi(); } } } private void backWifi(){ if(psDialog==null){ psDialog = new ProgressDialog(MenuActivity.this); psDialog.setMessage("WiFi連接失敗,請手動連接"); psDialog.setCancelable(false);機制的我使用了Android原生的Chronometer控件,關於這個控件大家可以百度一下,是在不知道的也可以私聊我哦好了,這樣就解決了我的需求了,一道20秒就提示用戶手動重連,哦了。