1. 程式人生 > >Android中實現Wifi列表的更新即wifi的連線與使用

Android中實現Wifi列表的更新即wifi的連線與使用

1.Manifest.xm配置WiFi許可權

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" />
<uses-permission android:name="android.permission.MASTER_CLEAR" />
<uses-permission android:name="android.permission.CAMERA" />

2.開啟wifi

public void openWifi() {
        if (!mWifiManager.isWifiEnabled()) {
             mWifiManager.setWifiEnabled(true);
    }
}

3.進行掃描

 public boolean startScan() {
        return mWifiManager.startScan();
    }

4.註冊監聽並通過返回重新整理WiFiList

        IntentFilter wifiFilter = new IntentFilter();
        wifiFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        wifiFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        wifiFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        wifiFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
        registerWifiReceiver(wifiFilter);

    public void registerWifiReceiver(IntentFilter intentFilter) {
        if (null == wifiReceiver) {
            wifiReceiver = new WifiReceiver();
        }
        mContext.registerReceiver(wifiReceiver, intentFilter);
    }

5.監聽網路變化

    class WifiReceiver extends BroadcastReceiver {
        public void onReceive(Context context, Intent intent) {
            Log.i(TAG, "onReceive: intent action" + intent.getAction());
            if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
          //當掃描結果後,進行重新整理列表 refreshLocalWifiListData(); if (null != listener) { listener.onScanResultAvailable(); } } else if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {//wifi連線網路狀態變化 refreshLocalWifiListData(); NetworkInfo.DetailedState state = ((NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO)).getDetailedState(); if (null != listener) { listener.onNetWorkStateChanged(state, mSSID); } } else if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {//wifi狀態變化 int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED); if (null != listener) { listener.onWiFiStateChanged(wifiState); } } else if (intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) { SupplicantState state = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE); int error = intent.getIntExtra(EXTRA_SUPPLICANT_ERROR, 0); if (null != listener) { if (error == WifiManager.ERROR_AUTHENTICATING) {
              //這裡可以獲取到監聽連線wifi密碼錯誤的時候進行回撥 listener.onWifiPasswordFault(); } } } } }

6.重新整理wifi列表

    public void refreshLocalWifiListData() {
//邏輯說明:
1.從掃描結果中將已經連線的wifi新增到wifi列表中
2.從所有WiFilist中將已經新增過的已經連線的WiFi移除
3.將剩餘的WiFi新增到WiFilist中
實現了已經連線的WiFi處於wifi列表的第一位


        //得到掃描結果
        mWifiList.clear();
        List<ScanResult> tmpList = mWifiManager.getScanResults();
        for (ScanResult tmp : tmpList) {
            if (isGivenWifiConnect(tmp.SSID)) {
                mWifiList.add(tmp);
            }
        }
        //從wifi列表中刪除已經連線的wifi
        for (ScanResult tmp : mWifiList) {
            tmpList.remove(tmp);
        }
       mWifiList.addAll(tmpList);
        }

    }

7.進行WiFi連線

  wifi連線的方式:1.WiFi configuration 2.將其新增到網路中。

  第一步:

 public WifiConfiguration creatWifiConfiguration(String ssid, String password) {
        ScanResult currentWIFI = null;
        WifiSecutityEnum type = WifiSecutityEnum.NOON;
        for (ScanResult temp : getmWifiList()) {
            if (temp.SSID.equals(ssid)) {
                currentWIFI = temp;
            }
        }
        if (currentWIFI != null) {
            Log.i(TAG, "creatWifiConfiguration: " + currentWIFI.toString());
            type = getWifiSecurityMode(currentWIFI.capabilities);
        }

        WifiConfiguration config = new WifiConfiguration();
        config.allowedAuthAlgorithms.clear();
        config.allowedGroupCiphers.clear();
        config.allowedKeyManagement.clear();
        config.allowedPairwiseCiphers.clear();
        config.allowedProtocols.clear();
        config.SSID = "\"" + ssid + "\"";
        //如果當前連線的wifi被儲存了密碼,清除wifi儲存資訊
        WifiConfiguration tempConfig = isWifiSave(ssid);
        if (tempConfig != null) {
            mWifiManager.removeNetwork(tempConfig.networkId);
            mWifiManager.saveConfiguration();
        }

        switch (type) {
            case NOON:
                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                break;
            case 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;
                break;
            case WPA_AND_WPA2:
                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;
                break;
        }
        return config;
    }

//如果之前有連線過WiFi,可以進行儲存或者不進行儲存
/**
* 判斷指定的wifi是否儲存
*
* @param SSID
* @return
*/
public WifiConfiguration isWifiSave(String SSID) {
if (mWifiConfigurations != null) {
for (WifiConfiguration existingConfig : mWifiConfigurations) {
if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
return existingConfig;
}
}
}
return null;
}

  第二步:

    public void connect(WifiConfiguration config) {
        int wcgID = mWifiManager.addNetwork(config);
        mWifiManager.enableNetwork(wcgID, true);
    }

第三步:監聽當前是否已經連線到網路

//判斷當前是否已經連線  
 public boolean isGivenWifiConnect(String SSID) {
        return isWifiConnected() && getCurentWifiSSID().equals(SSID);
    }

//得到當前連線的WiFi  SSID
    public String getCurentWifiSSID() {
        String ssid = "";
        ssid = mWifiManager.getConnectionInfo().getSSID();
        if (ssid.substring(0, 1).equals("\"")
                && ssid.substring(ssid.length() - 1).equals("\"")) {
            ssid = ssid.substring(1, ssid.length() - 1);
        }
        return ssid;
    }
  /**
     * 是否處於wifi連線的狀態
     *
     */
    public boolean isWifiConnected() {
        NetworkInfo wifiNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (wifiNetworkInfo.isConnected()) {
            return true;
        } else if (wifiNetworkInfo.isAvailable()) {
            return true;
        }

        return false;
    }

 8.監聽WifiConnect的狀態

public void onNetWorkStateChanged(NetworkInfo.DetailedState state) {
        if (state == NetworkInfo.DetailedState.SCANNING) {
            Log.i(TAG, "onReceive onNetWorkStateChanged: +正在掃描");
            mainView.showWifiConnectInfo("正在掃描");
        } else if (state == NetworkInfo.DetailedState.CONNECTING) {
            Log.i(TAG, "onReceive onNetWorkStateChanged: +正在連線");
            mainView.showWifiConnectInfo("正在連線");

        } else if (state == NetworkInfo.DetailedState.OBTAINING_IPADDR) {
            Log.i(TAG, "onReceive onNetWorkStateChanged: +獲取IP地址");
            mainView.showWifiConnectInfo("獲取IP地址");

        } else if (state == NetworkInfo.DetailedState.CONNECTED) {
            Log.i(TAG, "onReceive onNetWorkStateChanged: +建立連線");
            mainView.showWifiConnectInfo("建立連線");

        } else if (state == NetworkInfo.DetailedState.DISCONNECTING) {
            Log.i(TAG, "onReceive onNetWorkStateChanged: +正在斷開連線");
            mainView.showWifiConnectInfo("正在斷開連線");

        } else if (state == NetworkInfo.DetailedState.DISCONNECTED) {
            Log.i(TAG, "onReceive onNetWorkStateChanged: +已斷開連線");
            mainView.showWifiConnectInfo("已斷開連線");

        } else if (state == NetworkInfo.DetailedState.FAILED) {
            Log.i(TAG, "onReceive onNetWorkStateChanged: +連線失敗");
            mainView.showWifiConnectInfo("連線失敗");

        }
//同時可以更新view的列表
        mainView.updateWifiListView();
    }

  9.斷開連線

 public void disConnectWifi(){
        mWifiManager.disconnect();
    }

 //斷開指定ID的網路
 public void disConnectionWifi(int netId) {
        mWifiManager.disableNetwork(netId);
        mWifiManager.disconnect();
    }