1、獲取wifi列表web
獲取wifi列表須要用wifiManager.startScan();進行掃描,掃描結果的列表使用List<ScanResult> 保存緩存
掃描步驟:網絡
wifiManager.startScan(); //開啓掃描異步
scanResultList = wifiManager.getScanResults(); // 掃描返回結果列表測試
注意:由於startScan是異步的,若是一直掃描,scanResultList中有可能會有些熱點名稱是重複的,實際上是同一個熱點,這時須要進行下過濾。this
下面附上ScanResult的字段說明:加密
BSSID:fc:e3:3c:4e:f0:34.net
capabilities:[WPA-PSK-TKIP][ESS] 加密方案對象
frequency:2412ip
level:-48 ->信號的強弱標誌(單位dBm分貝毫伏)
SSID:ChinaNet-kgdp ->咱們平時輸入的wifi名稱
timestamp:238673772811
describeContents():0
level根據數值能夠分爲5個等級的信號強弱:
Level>-50 信號最強4格
-50<Level<-65 信號3格
-65<Level<-75 信號2格
-75<Level<-90 信號1格
-90<Level 信號0格
2、鏈接WIFI
鏈接wifi分兩種,已經配置過的wifi以及未配置過的wifi
一、鏈接已經配置過的wifi
檢查是否已經配置過該wifi,經過WifiManager獲取已經配置的wifi列表
List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();
傳入要鏈接的wifi的SSID(即wifi名稱,匹配獲得則不用輸入密碼便可鏈接,匹配不到則要輸入密碼才能鏈接)
這裏須要注意的是:WifiConfiguration裏封裝的wifi的SSID是包含雙引號的,而ScanResult的SSID是不包含雙引號的,這裏進行遍歷比較時須要注意!對於鏈接已經配置過的wifi,這裏遍歷的結果返回一個WifiConfiguration的對象,拿來實現鏈接;另外這裏的wifiManager已經存在了要鏈接的wifi的networkId,因此不用從新調用wifiManager的addNetwork方法,咱們曾經出現過一個問題就是測試用久以後wifi鏈接會變得很慢,緣由就是咱們一每次鏈接都調用了addNetwork方法,引發緩存過多,因此這裏切記不能亂用addNetwork。
下面來看看代碼實現:
/**
* 已有配置連接
*
* @param wf
* @return
*/
public boolean Connect(WifiConfiguration wf) {
if (!this.OpenWifi()) {
return false;
}
// 狀態變成WIFI_STATE_ENABLED的時候才能執行下面的語句,即當狀態爲WIFI_STATE_ENABLING時,讓程序在while裏面跑
while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {
try {
// 爲了不程序一直while循環,讓它睡個100毫秒在檢測……
Thread.currentThread();
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}
boolean bRet = wifiManager.enableNetwork(wf.networkId, true);
wifiManager.saveConfiguration();
return bRet;
}
二、鏈接未經配置過的wifi
輸入密碼,根據密碼建立一個配置信息類
WifiConfiguration wifiConfig = this.CreateWifiInfo(SSID, Password, Type);
注:這裏的type是wifi的加密類型,加密類型查看源碼有
/**
* 加密類型
*
* @author Administrator
*
*/
public enum WifiCipherType {
WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID
}
通常使用WIFICIPHER_WPA這種加密方式,還有web以及無密碼的方式。
而後調用addNetwork把配置信息加入WifiManager(這裏返回networkId ),加入後默認是DISABLED(即斷開狀態的),還要再調用WifiManager.enableNetwork(int netId, boolean disableOthers)去啓用,這裏傳入參數addNetwork方法返回的networkId ,就能啓動鏈接了,布爾值傳入true,關閉別的網絡,代碼:
/**
* 無配置記錄連接方式
*
* @param SSID
* @param Password
* @param Type
* @return true or false
*/
public boolean Connect(String SSID, String Password, WifiCipherType Type) {
if (!this.OpenWifi()) {
return false;
}
// 狀態變成WIFI_STATE_ENABLED的時候才能執行下面的語句
while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {
try {
// 爲了不程序一直while循環,讓它睡個100毫秒在檢測……
Thread.currentThread();
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}
WifiConfiguration wifiConfig = this.CreateWifiInfo(SSID, Password, Type);
int netID = wifiManager.addNetwork(wifiConfig);
boolean bRet = wifiManager.enableNetwork(netID, true);
wifiManager.saveConfiguration();
return bRet;
}
注意點:
一、首先權限,權限請參考上一篇博客:《1、Android打開WIFI》
二、個別手機若是獲取不到wifi列表極可能就是權限有問題,請檢查權限。
三、不管是獲取wifi列表仍是鏈接wifi, 都要先打開wifi。
好了,獲取wifi列表與wifi鏈接就說到這裏,下篇博客咱們再說下《Android開啓wifi熱點》