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