標籤:反射 開啟 pass src pretty 網路 cti 簡單的 public
相對於BlueTooth,WiFi是當今使用最廣的一種無線網路傳輸技術, 幾乎所有智能手機、平板電腦和膝上型電腦都支援Wi-Fi上網。因此,掌握基本的WiFI開發技術是非常必要的。本教程將圍繞一個小Demo初步與大家一同探討WiFi開發。先上
Demo功能比較簡單,四個按鈕、兩個文本和一個列表。功能主要有建立WiFi熱點,關閉WiFi熱點,搜尋WiFi,串連WiFi,資料通訊。源碼會在教程結尾提供。本章節主要介紹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.INTERNET"/>
WiFi熱點的建立
/** * 建立Wifi熱點 */ private void createWifiHotspot() { if (wifiManager.isWifiEnabled()) { //如果wifi處於開啟狀態,則關閉wifi, wifiManager.setWifiEnabled(false); } WifiConfiguration config = new WifiConfiguration(); config.SSID = WIFI_HOTSPOT_SSID; config.preSharedKey = "123456789"; 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.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers .set(WifiConfiguration.PairwiseCipher.CCMP); config.status = WifiConfiguration.Status.ENABLED; //通過反射調用設定熱點 try { Method method = wifiManager.getClass().getMethod( "setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE); boolean enable = (Boolean) method.invoke(wifiManager, config, true); if (enable) { textview.setText("熱點已開啟 SSID:" + WIFI_HOTSPOT_SSID + " password:123456789"); } else { textview.setText("建立熱點失敗"); } } catch (Exception e) { e.printStackTrace(); textview.setText("建立熱點失敗"); } }
這裡我們需要用到一個很重要的API——WifiManager。源碼中是有這麼一段介紹:
This class provides the primary API for managing all aspects of Wi-Ficonnectivity. Get an instance of this class by calling{@link android.content.Context#getSystemService(String) Context.getSystemService(Context.WIFI_SERVICE)}.
可以瞭解到,我們能夠通過WifiManager來管理WiFi的串連。而通過Context.getSystemService(Context.WIFI_SERVICE)就能擷取到它的執行個體。
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
在開啟熱點的時候,我們需要確保WiFi是關閉狀態,因為大部分手機都是不支援熱點和WiFi是同時開啟的。接著就需要建立WifiConfiguration這個類,由於配置我們所要建立的熱點的屬性。這裡我們所需注意的主要是SSID、preSharedKey和KeyMgmt。 分別對應熱點的名稱、密碼和加密方式。配置完屬性後,我們就可以通過Java的反射機制去建立熱點。WiFi熱點的關閉
/** * 關閉WiFi熱點 */ public void closeWifiHotspot() { try { Method method = wifiManager.getClass().getMethod("getWifiApConfiguration"); method.setAccessible(true); WifiConfiguration config = (WifiConfiguration) method.invoke(wifiManager); Method method2 = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); method2.invoke(wifiManager, config, false); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
跟建立WiFI熱點一樣,關閉的時候同樣需要用到Java的反射機制。在調用Method的invoke方法時,將最後一個參數改成false就可以了。相對來說,WiFi熱點的建立與關閉還是比較簡單的。歡迎繼續閱讀下一篇Android WiFi開發教程(二)——WiFi的搜尋和串連
Android WiFi開發教程(一)——WiFi熱點的建立與關閉