您好,登錄后才能下訂單哦!
WIFI就是一種無線聯網技術,常見的是使用無線路由器。那么在這個無線路由器的信號覆蓋的范圍內都可以采用WIFI連接的方式進行聯網。如果無線路由器連接了一個ADSL線路或其他的聯網線路,則又被稱為“熱點”。
在Android中對Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面,主要包括以下幾個類和接口:
1.ScanResult
主要用來描述已經檢測出的接入點,包括接入點的地址,接入點的名稱,身份認證,頻率,信號強度等信息。其實就是通過wifi 硬件的掃描來獲取一些周邊的wifi 熱點的信息。
2.WifiConfiguration
Wifi網絡的配置,包括安全設置等,在我們連通一個wifi 接入點的時候,需要獲取到的一些信息。主要包含四個屬性:
BSSID:
BSS是一種特殊的Ad-hoc LAN(一種支持點對點訪問的無線網絡應用模式)的應用,一個無線網絡至少由一個連接到有線網絡的AP和若干無線工作站組成,這種配置稱為一個基本服務裝置。一群計算機設定相同的 BSS名稱,即可自成一個group,而此BSS名稱,即所謂BSSID。通常,手機WLAN中,bssid其實就是無線路由的MAC地址。
networkid:網絡ID。
PreSharedKey:無線網絡的安全認證模式。
SSID:SSID(Service Set Identif)用于標識無線局域網,SSID不同的無線網絡是無法進行互訪的。
3.WifiInfo
wifi無線連接的描述,包括(接入點,網絡連接狀態,隱藏的接入點,IP地址,連接速度,MAC地址,網絡ID,信號強度等信息)。這里簡單介紹一下WifiManager中常用的方法:
getSSID() | 獲得SSID(熱點名稱) |
getBSSID() | 獲取BSSID |
getDetailedStateOf() | 獲取客戶端的連通性 |
getHiddenSSID() | 獲得SSID 是否被隱藏 |
getIpAddress() | 獲取IP 地址 |
getLinkSpeed() | 獲得連接的速度 |
getMacAddress() | 獲得Mac 地址 |
getRssi() | 獲得802.11n 網絡的信號 |
4.WifiManager
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熱點可用 |
5. 在AndroidManifest.xml進行對WIFI操作的權限設置
<!-- 以下是使用wifi訪問網絡所需的權限 --> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
下面是匯總的一個wifi管理工具類,我完善了一下,并加上了詳細的注解,很實用的!
WifiAdmin類: (wifi管理工具類)
package com.zhf.wifidemo.wifi.utils; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Iterator; import java.util.List; import android.content.Context; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; /** * WIFI管理類 * @author ZHF * */ public class WifiAdmin { private static WifiAdmin wifiAdmin = null; private List<WifiConfiguration> mWifiConfiguration; //無線網絡配置信息類集合(網絡連接列表) private List<ScanResult> mWifiList; //檢測到接入點信息類 集合 //描述任何Wifi連接狀態 private WifiInfo mWifiInfo; WifiManager.WifiLock mWifilock; //能夠阻止wifi進入睡眠狀態,使wifi一直處于活躍狀態 public WifiManager mWifiManager; /** * 獲取該類的實例(懶漢) * @param context * @return */ public static WifiAdmin getInstance(Context context) { if(wifiAdmin == null) { wifiAdmin = new WifiAdmin(context); } return wifiAdmin; } private WifiAdmin(Context context) { //獲取系統Wifi服務 WIFI_SERVICE this.mWifiManager = (WifiManager) context.getSystemService("wifi"); //獲取連接信息 this.mWifiInfo = this.mWifiManager.getConnectionInfo(); } /** * 是否存在網絡信息 * @param str 熱點名稱 * @return */ private WifiConfiguration isExsits(String str) { Iterator localIterator = this.mWifiManager.getConfiguredNetworks().iterator(); WifiConfiguration localWifiConfiguration; do { if(!localIterator.hasNext()) return null; localWifiConfiguration = (WifiConfiguration) localIterator.next(); }while(!localWifiConfiguration.SSID.equals("\"" + str + "\"")); return localWifiConfiguration; } /**鎖定WifiLock,當下載大文件時需要鎖定 **/ public void AcquireWifiLock() { this.mWifilock.acquire(); } /**創建一個WifiLock**/ public void CreateWifiLock() { this.mWifilock = this.mWifiManager.createWifiLock("Test"); } /**解鎖WifiLock**/ public void ReleaseWifilock() { if(mWifilock.isHeld()) { //判斷時候鎖定 mWifilock.acquire(); } } /**打開Wifi**/ public void OpenWifi() { if(!this.mWifiManager.isWifiEnabled()){ //當前wifi不可用 this.mWifiManager.setWifiEnabled(true); } } /**關閉Wifi**/ public void closeWifi() { if(mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(false); } } /**端口指定id的wifi**/ public void disconnectWifi(int paramInt) { this.mWifiManager.disableNetwork(paramInt); } /**添加指定網絡**/ public void addNetwork(WifiConfiguration paramWifiConfiguration) { int i = mWifiManager.addNetwork(paramWifiConfiguration); mWifiManager.enableNetwork(i, true); } /** * 連接指定配置好的網絡 * @param index 配置好網絡的ID */ public void connectConfiguration(int index) { // 索引大于配置好的網絡索引返回 if (index > mWifiConfiguration.size()) { return; } //連接配置好的指定ID的網絡 mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, true); } /** * 根據wifi信息創建或關閉一個熱點 * @param paramWifiConfiguration * @param paramBoolean 關閉標志 */ public void createWifiAP(WifiConfiguration paramWifiConfiguration,boolean paramBoolean) { try { Class localClass = this.mWifiManager.getClass(); Class[] arrayOfClass = new Class[2]; arrayOfClass[0] = WifiConfiguration.class; arrayOfClass[1] = Boolean.TYPE; Method localMethod = localClass.getMethod("setWifiApEnabled",arrayOfClass); WifiManager localWifiManager = this.mWifiManager; Object[] arrayOfObject = new Object[2]; arrayOfObject[0] = paramWifiConfiguration; arrayOfObject[1] = Boolean.valueOf(paramBoolean); localMethod.invoke(localWifiManager, arrayOfObject); return; } catch (Exception e) { e.printStackTrace(); } } /** * 創建一個wifi信息 * @param ssid 名稱 * @param passawrd 密碼 * @param paramInt 有3個參數,1是無密碼,2是簡單密碼,3是wap加密 * @param type 是"ap"還是"wifi" * @return */ public WifiConfiguration createWifiInfo(String ssid, String passawrd,int paramInt, String type) { //配置網絡信息類 WifiConfiguration localWifiConfiguration1 = new WifiConfiguration(); //設置配置網絡屬性 localWifiConfiguration1.allowedAuthAlgorithms.clear(); localWifiConfiguration1.allowedGroupCiphers.clear(); localWifiConfiguration1.allowedKeyManagement.clear(); localWifiConfiguration1.allowedPairwiseCiphers.clear(); localWifiConfiguration1.allowedProtocols.clear(); if(type.equals("wt")) { //wifi連接 localWifiConfiguration1.SSID = ("\"" + ssid + "\""); WifiConfiguration localWifiConfiguration2 = isExsits(ssid); if(localWifiConfiguration2 != null) { mWifiManager.removeNetwork(localWifiConfiguration2.networkId); //從列表中刪除指定的網絡配置網絡 } if(paramInt == 1) { //沒有密碼 localWifiConfiguration1.wepKeys[0] = ""; localWifiConfiguration1.allowedKeyManagement.set(0); localWifiConfiguration1.wepTxKeyIndex = 0; } else if(paramInt == 2) { //簡單密碼 localWifiConfiguration1.hiddenSSID = true; localWifiConfiguration1.wepKeys[0] = ("\"" + passawrd + "\""); } else { //wap加密 localWifiConfiguration1.preSharedKey = ("\"" + passawrd + "\""); localWifiConfiguration1.hiddenSSID = true; localWifiConfiguration1.allowedAuthAlgorithms.set(0); localWifiConfiguration1.allowedGroupCiphers.set(2); localWifiConfiguration1.allowedKeyManagement.set(1); localWifiConfiguration1.allowedPairwiseCiphers.set(1); localWifiConfiguration1.allowedGroupCiphers.set(3); localWifiConfiguration1.allowedPairwiseCiphers.set(2); } }else {//"ap" wifi熱點 localWifiConfiguration1.SSID = ssid; localWifiConfiguration1.allowedAuthAlgorithms.set(1); localWifiConfiguration1.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); localWifiConfiguration1.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); localWifiConfiguration1.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); localWifiConfiguration1.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); localWifiConfiguration1.allowedKeyManagement.set(0); localWifiConfiguration1.wepTxKeyIndex = 0; if (paramInt == 1) { //沒有密碼 localWifiConfiguration1.wepKeys[0] = ""; localWifiConfiguration1.allowedKeyManagement.set(0); localWifiConfiguration1.wepTxKeyIndex = 0; } else if (paramInt == 2) { //簡單密碼 localWifiConfiguration1.hiddenSSID = true;//網絡上不廣播ssid localWifiConfiguration1.wepKeys[0] = passawrd; } else if (paramInt == 3) {//wap加密 localWifiConfiguration1.preSharedKey = passawrd; localWifiConfiguration1.allowedAuthAlgorithms.set(0); localWifiConfiguration1.allowedProtocols.set(1); localWifiConfiguration1.allowedProtocols.set(0); localWifiConfiguration1.allowedKeyManagement.set(1); localWifiConfiguration1.allowedPairwiseCiphers.set(2); localWifiConfiguration1.allowedPairwiseCiphers.set(1); } } return localWifiConfiguration1; } /**獲取熱點名**/ public String getApSSID() { try { Method localMethod = this.mWifiManager.getClass().getDeclaredMethod("getWifiApConfiguration", new Class[0]); if (localMethod == null) return null; Object localObject1 = localMethod.invoke(this.mWifiManager,new Object[0]); if (localObject1 == null) return null; WifiConfiguration localWifiConfiguration = (WifiConfiguration) localObject1; if (localWifiConfiguration.SSID != null) return localWifiConfiguration.SSID; Field localField1 = WifiConfiguration.class .getDeclaredField("mWifiApProfile"); if (localField1 == null) return null; localField1.setAccessible(true); Object localObject2 = localField1.get(localWifiConfiguration); localField1.setAccessible(false); if (localObject2 == null) return null; Field localField2 = localObject2.getClass().getDeclaredField("SSID"); localField2.setAccessible(true); Object localObject3 = localField2.get(localObject2); if (localObject3 == null) return null; localField2.setAccessible(false); String str = (String) localObject3; return str; } catch (Exception localException) { } return null; } /**獲取wifi名**/ public String getBSSID() { if (this.mWifiInfo == null) return "NULL"; return this.mWifiInfo.getBSSID(); } /**得到配置好的網絡 **/ public List<WifiConfiguration> getConfiguration() { return this.mWifiConfiguration; } /**獲取ip地址**/ public int getIPAddress() { return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress(); } /**獲取物理地址(Mac)**/ public String getMacAddress() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress(); } /**獲取網絡id**/ public int getNetworkId() { return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId(); } /**獲取熱點創建狀態**/ public int getWifiApState() { try { int i = ((Integer) this.mWifiManager.getClass() .getMethod("getWifiApState", new Class[0]) .invoke(this.mWifiManager, new Object[0])).intValue(); return i; } catch (Exception localException) { } return 4; //未知wifi網卡狀態 } /**獲取wifi連接信息**/ public WifiInfo getWifiInfo() { return this.mWifiManager.getConnectionInfo(); } /** 得到網絡列表**/ public List<ScanResult> getWifiList() { return this.mWifiList; } /**查看掃描結果**/ public StringBuilder lookUpScan() { StringBuilder localStringBuilder = new StringBuilder(); for (int i = 0; i < mWifiList.size(); i++) { localStringBuilder.append("Index_"+new Integer(i + 1).toString() + ":"); //將ScanResult信息轉換成一個字符串包 //其中把包括:BSSID、SSID、capabilities、frequency、level localStringBuilder.append((mWifiList.get(i)).toString()); localStringBuilder.append("\n"); } return localStringBuilder; } /** 設置wifi搜索結果 **/ public void setWifiList() { this.mWifiList = this.mWifiManager.getScanResults(); } /**開始搜索wifi**/ public void startScan() { this.mWifiManager.startScan(); } /**得到接入點的BSSID**/ public String GetBSSID() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID(); } }
更多相關知識點文章:
最后,成功連接到wifi后,通過本機IP地址便可以進行相關網絡開發,在下一篇中我會講解一個WIFI熱點搜索、創建、連接的Demo(http://smallwoniu.blog.51cto.com/3911954/1338618),希望能幫助到大家!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。