相對於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-Fi connectivity. 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(); } }