Android中實現Wifi列表的更新即wifi的連線與使用
阿新 • • 發佈:2019-02-20
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();
}