Wifi連接與使用
阿新 • • 發佈:2018-07-18
使用 配置 per n) hidden highlight nec tde 判斷
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連接與使用