Android學習——WiFi
WiFi類
WiFi是一種無線聯網技術,常見的是使用無線路由器。那麼在這個訊號覆蓋的範圍內都可以採用WiFi連線的方式進行聯網。如果無線路由器連線了一個ADSL線路或者其他的聯網線路,則又被稱為“熱點”。
在Android中對WiFi操作,Android本身提供一些有用的包,在anroid.net.wifi包下面。
WiFi常用的類
ScanResult
主要用來描述已經檢測出的接入點,包括接入點地址,接入點名稱,身份認證,頻率,訊號強度等資訊。
WifiConfiguration
Wifi網路的配置,包括安全設定等,在我們連通一個wifi 接入點的時候,需要獲取到的一些資訊。主要包含四個屬性:
BSSID
是一種特殊的Ad-hoc LAN
(一種支援點對點訪問的無線網路應用模式)的應用,一個無線網路至少由一個連線到有線網路的AP和若干無線工作站組成,這種配置稱為一個基本服務裝置。一群計算機設定相同的
BSS名稱,即可自成一個group,而此BSS名稱,即所謂BSSID。通常,手機WLAN中,bssid其實就是無線路由的MAC地址。
networkid
網路ID。
PreSharedKey
無線網路的安全認證模式。
SSID
SSID(Service Set Identif)用於標識無線區域網,SSID不同的無線網路是無法進行互訪的。
WifiInfo
wifi無線連線的描述,包括接入點,網路連線狀態,隱藏的接入點,IP地址,連線速度,MAC地址,網路ID,訊號強度等資訊。這裡簡單介紹一下這裡的方法:
getBSSID() //獲取BSSID getDetailedStateStateOf() //獲取客戶端的連通性 getHiddenSSID() //獲取SSID是否被隱藏 getIpAddress() //獲取IP地址 getLinkSpeed() //獲取連線速度 getMacAdress() //獲取Mac地址 getRssi() //獲取802.11n網路訊號 getSSID() //獲取SSID getSupplicanState() //返回具體客戶端狀態資訊
WiFiManager
用來管理我們的wifi 連線,這裡已經定義好了一些類,可以供我們使用,獲取WiFi網絡卡狀態。
WiFi常量
WIFI網絡卡的狀態是由一系列的整形常量來表示的。
WIFI_STATE_DISABLING = 0 WIFI網絡卡正在關閉
WIFI_STATE_DISABLED = 1 WIFI網絡卡不可用
WIFI_STATE_ENABLING = 2 WIFI網正在開啟 (WIFI啟動需要一段時間)
WIFI_STATE_ENABLED = 3 WIFI網絡卡可用
WIFI_STATE_UNKNOWN = 4 未知網絡卡狀態
WIFI_AP_STATE_DISABLING = 10 WIFI熱點正在關閉
WIFI_AP_STATE_DISABLED = 11 WIFI熱點不可用
WIFI_AP_STATE_ENABLING = 12 WIFI熱點正在開啟
WIFI_AP_STATE_ENABLED = 13 WIFI熱點可用
WiFi許可權
WiFi需求申請許可權,在AndroidManifest.xml檔案中填寫。
1.<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>//改變WiFi狀態。
2. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>//改變WiFi多播狀態
3. <uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE"/>//獲取WiFi狀態。
4. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
常用的方法
1.開啟WiFi
//開啟WiFi
public void WiFiOpen(){
if(!localWifiManager.isWifiEnabled()){
localWifiManager.setWifiEnabled(true);
}
}
2.掃描WiFi訊號
//掃描wifi
public void WifiStartScan(){
localWifiManager.startScan();
}
3.得到掃描WIFI結果
//得到Wifi配置好的資訊
public void getConfiguration(){
wifiConfigList =localWifiManager.getConfiguredNetworks()//得到配置好的網路資訊
for(int i =0;i<wifiConfigList.size();i++){
Log.i("getConfiguration",wifiConfigList.get(i).SSID);
Log.i("getConfiguration",String.valueOf(wifiConfigList.get(i).networkId));
}
}
4.根據WIFI的名稱SSID判定指定WIFI是否已經配置好,配置好則返回其networkId,用於連線。之前嘗試了BSSID地址沒成功,所以只能使用SSID
//判定指定WIFI是否已經配置好,依據WIFI的地址BSSID,返回NetId
public int IsConfiguration(String SSID){
Log.i("IsConfiguration",String.valueOf(wifiConfigList.size()));
for(int i = 0; i < wifiConfigList.size(); i++){
Log.i(wifiConfigList.get(i).SSID,String.valueOf(wifiConfigList.get(i).networkId));
if(wifiConfigList.get(i).SSID.equals(SSID)){//地址相同
return wifiConfigList.get(i).networkId;
}
}
return -1;
}
5.如果需要連線的WIFI沒有配置好,即沒有儲存密碼。則為指定名稱ssid的WIFI新增密碼資訊psw,新增成功後返回給其分配的networId,同於連線
//新增指定WIFI的配置資訊,原列表不存在此SSID
public int AddWifiConfig(List<ScanResult> wifiList,String ssid,String pwd){
int wifiId = -1;
for(int i = 0;i < wifiList.size(); i++){
ScanResult wifi = wifiList.get(i);
if(wifi.SSID.equals(ssid)){
Log.e("AddWifiConfig","equals");
WifiConfiguration wifiCong = new WifiConfiguration();
wifiCong.SSID = "\""+wifi.SSID+"\"";//\"轉義字元,代表"
wifiCong.preSharedKey = "\""+pwd+"\"";//WPA-PSK密碼
wifiCong.hiddenSSID = false;
wifiCong.status = WifiConfiguration.Status.ENABLED;
wifiId = localWifiManager.addNetwork(wifiCong);//將配置好的特
定WIFI密碼資訊新增,新增完成後預設是不啟用狀態,成功返回ID,否則為-1
if(wifiId != -1){
return wifiId;
}
}
}
return wifiId;
}
6.根據步驟6配置好需要連線的WIFI密碼資訊後,下面通過networkId連線指定WIFI。在連線經過步驟6剛新增配置資訊的WIFI訊號之前需要重新執行下步驟4,得到新的配置好資訊的列表。
//連線指定Id的WIFI
public boolean ConnectWifi(int wifiId){
for(int i = 0; i < wifiConfigList.size(); i++){
WifiConfiguration wifi = wifiConfigList.get(i);
if(wifi.networkId == wifiId){
while(!(localWifiManager.enableNetwork(wifiId, true))){//啟用該Id,建立連線
//status:0--已經連線,1--不可連線,2--可以連線
Log.i("ConnectWifi",String.valueOf(wifiConfigList.get(w
ifiId).status));
}
return true;
}
}
return false;
}