码迷,mamicode.com
首页 > 其他好文 > 详细

Wifi连接与使用

时间:2018-07-18 20:27:54      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:地址   信息   tin   manage   rdf   view   listener   dal   scan   

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();
    }

  

 

Wifi连接与使用

标签:地址   信息   tin   manage   rdf   view   listener   dal   scan   

原文地址:https://www.cnblogs.com/zhoujianan/p/9332175.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!