訪問Android硬體資源の管理網路和Wifi串連

來源:互聯網
上載者:User

(1)ConnectivityManager

在Android中,ConnectivityManager類代表網路連接服務,它被用來監控網路連接狀態,配置失效重連,並控制網路天線等。擷取Connectivity Manager執行個體的方法是使用getSystemService,並指定Context.CONNECTIVITY_SERVICE作為參數,程式碼片段如下:

String cserviceName = Context.CONNECTIVITY_SERVICE;<br />ConnectivityManager cm = (ConnectivityManager) getSystemService(cserviceName);<br />要使用Connectivity Manager來讀寫網路狀態時,需要在AndroidManifest.xml檔案中加入如下的許可:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><br /><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/><br />

Connectivity Manager在較高層面提供了管理可用網路連接的介面,使用getActiveNetworkInfo和getNetworkInfo函數可以查詢擷取NetworkInfo對象,該對象包含了當前活動網路連接或者指定類型的不可用網路連接的詳細資料。

1.1)設定首選網路

當任何認證的應用程式請求網路連接時,Android都會優先嘗試使用首選網路連接。設定首選網路連接的函數是setNetworkPreference,程式碼片段如下:

cm.setNetworkPreference(ConnectivityManager.TYPE_WIFI);<br />

當首選網路連接不可用或者串連丟失時,Android將自動嘗試使用第二優先連線類型。


1.2)監控網路連接

ConnectivityManager最常用的一個功能就是當網路連接狀態改變時通知應用程式,這是通過應用程式實現自己的Broadcast Receiver來監聽ConnectivityManager.CONNECTIVITY_ACTION類型的intent來實現的。這個intent提供了以下幾種extra來進一步明確發生改變的網路狀態:

1)ConnectivityManager.EXTRA_IS_FAILOVER:值為true說明當前的串連是首選網路失效重連後的串連;

2)ConnectivityManager.EXTRA_NO_CONNECTIVITY:值為true表示當前裝置沒有串連到網路;

3)ConnectivityManager.EXTRA_REASON:如果當前的廣播代表網路失效,則這個值包含了串連失效的原因描述;

4)ConnectivityManager.EXTRA_NETWORK_INFO:返回NetworkInfo對象,包含了當前串連事件相關的網路詳細資料;

5)ConnectivityManager.EXTRA_OTHER_NETWORK_INFO:在一個網路中斷連線時,這個值返回NetworkInfo對象,包含了可能的網路失效重連的詳細資料;

6)ConnectivityManager.EXTRA_EXTRA_INFO:包含可選的網路連接的額外資訊。


(2)WifiManager

WifiManager代表Android中的Wi-Fi串連服務,它被用於配置Wi-Fi網路連接,管理當前Wi-Fi串連,掃描Wi-Fi存取點和監控Wi-Fi串連的狀態改變。擷取WifiManager的方法和Connectivity Manager類似,通過函數getSystemService,並提供參數Context.WIFI_SERVICE,程式碼片段如下:

String wserviceName = Context.WIFI_SERVICE;<br />WifiManager wm = (WifiManager) getSystemService(wserviceName);<br />

同樣的,需要在AndroidManifest.xml檔案中指定訪問許可:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><br /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/><br />

我們可以使用setWifiEnabled函數來設定使能和去使能Wi-Fi硬體,使用getWifiState和isWifiEnabled函數來查看當前Wi-Fi狀態,程式碼片段如下:

if (!wm.isWifiEnabled()) {<br /> if (WifiManager.WIFI_STATE_ENABLING != wm.getWifiState()) {<br /> wm.setWifiEnabled(true);<br /> }<br />}


 

2.1)監控Wi-Fi串連

在Wi-Fi網路連接狀態改變時,Wi-Fi Manager將廣播相應的intent,有如下幾種:

1)WifiManager.WIFI_STATE_CHANGED_ACTION:標識Wi-Fi硬體狀態改變,可能在enabling、enabled、disabling、disabled和unknown之間改變。它包含了兩個額外的索引值EXTRA_WIFI_STATE和EXTRA_PREVIOUS_STATE,分別表示新的和前一個Wi-Fi狀態。

2)WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION:Wi-Fi硬體和當前存取點之間的串連狀態改變時,這個intent將被廣播。額外的索引值EXTRA_NEW_STATE用來表示是新的串連建立事件還是已存在的串連中斷事件,為true表示新的串連建立。

3)WifiManager.NETWORK_STATE_CHANGED_ACTION:Wi-Fi串連狀態改變時廣播這個intent,包含兩個額外的索引值:一是EXTRA_NETWORK_INFO,它包含表示當前網路狀態的NetworkInfo對象;一是EXTRA_BSSID,包含串連到的存取點的BSSID值。

4)WifiManager.RSSI_CHANGED_ACTION:監聽這個intent可以使應用程式監控當前Wi-Fi串連的訊號強度。包含一個額外索引值EXTRA_NEW_RSSI,包含了當前訊號強度。使用這個訊號強度,需要使用靜態函數calculateSignalLevel將這個值按指定的縮放轉換為整型值。


2.2)建立和管理Wi-Fi串連和配置

使用WiFi Manager可以進行網路設定,控制串連到哪個網路。當串連建立後,可以進一步擷取活動網路連接的額外配置資訊。使用函數getConfiguredNetworks可獲得當前網路設定資訊的列表,傳回值是WifiConfiguration對象,包含了網路ID、SSID和其他配置資訊。

要使用某一網路連接,可使用enableNetwork函數,傳入網路ID並設定disableAllOthers參數為true即可,程式碼片段如下:

// Get a list of available configurations<br />List<WifiConfiguration> configurations = wm.getConfiguredNetworks();<br />// Get the network ID for the first one<br />if (configurations.size() > 0) {<br /> int netID = configurations.get(0).networkId;<br /> // Enable the network<br /> boolean disableAllOthers = true;<br /> wm.enableNetwork(netID, disableAllOthers);<br />}

一旦串連建立,就可以使用getConnectionInfo函數來返回串連的狀態,返回的是WifiInfo對象,包含了當前存取點的BSSID、Mac地址、IP地址,以及當前鏈路速度和訊號強度。

下面的程式碼片段用於查詢當前活動Wi-Fi串連並顯示擷取的相關資訊:

WifiInfo info = wm.getConnectionInfo();<br />if (null != info.getBSSID()) {<br /> int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5);<br /> int speed = info.getLinkSpeed();<br /> String units = WifiInfo.LINK_SPEED_UNITS;<br /> String ssid = info.getSSID();</p><p> String toastText = String.format("Connected to {0} at {1}{2}. Strength {3}/5", ssid, speed, units, strength);<br /> Toast.makeText(this.getApplicationContext(), toastText, Toast.LENGTH_LONG);<br />}

2.3)掃描Wifi熱點

我們可以使用startScan函數進行Wifi存取點的掃描,當掃描結束且結果可用時,WifiManager將發送SCAN_RESULTS_AVAILABLE_ACTIONL類型的intent。使用getScanResults函數可以擷取掃描的結果資訊,並儲存中ScanResult對象中。ScanResult對象中存放了檢測到的每個存取點的詳細資料,包括鏈路速度、訊號強度、SSID和支援的認證技術。下面程式碼片段顯示了Wifi熱點掃描的過程:

// Register a broadcast receiver that listens for scan results<br /> registerReceiver(new BroadcastReceiver() {</p><p> @Override<br /> public void onReceive(Context context, Intent intent) {<br /> List<ScanResult> results = wifi.getScanResults();<br /> ScanResult bestSignal = null;<br /> for (ScanResult result : results) {<br /> if (null == bestSignal ||<br /> WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) {<br /> bestSignal = result;<br /> }<br /> }</p><p> String toastText = String.format("{0} networks found. {1} is the strongest.",<br /> results.size(), bestSignal.SSID);<br /> Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_LONG);<br /> }</p><p> }, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));</p><p> //Initiate a scan<br /> wifi.startScan();

要串連到網路,需要建立和註冊WiFi配置,通常使用者可以使用Android系統原生的WiFi配置程式,但我們也可以在自己的應用程式中提供相同的功能,設定完全替代原生的WiFi配置程式,這就要用到儲存網路設定資訊的WifiConfiguration類了。每個WiFi配置一般都會包含以下幾個公用的資料項目:

1)BSSID:指明存取點的BSSID;

2)SSID:某一特定網路的SSID;

3)networkId:用來唯一標識當前裝置使用的網路設定的id;

4)priority:選擇串連哪個存取點時要使用的每個網路設定的優先權;

5)status:當前網路連接的狀態,取值如下:

WifiConfiguration.Status.ENABLED,WifiConfiguration.Status.DISABLED,

WifiConfiguration.Status.CURRENT。

WifiConfiguration對象中還包括支援的認證技術以及用於與存取點進行認證的密鑰。

使用addNetwork函數可以將新的WiFi配置添加到當前WiFi列表中,類似的,updateNetwork函數可以用於更新某個已存在的WiFi配置的某些資訊;removeNetwork函數用於移除配置資訊。要儲存網路設定的任何變化,需要調用saveConfiguration函數。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.