相對於BlueTooth,WiFi是當今使用最廣的一種無線網絡傳輸技術, 幾乎所有智能手機、平板電腦和筆記本電腦都支持Wi-Fi上網。因此,掌握基本的WiFI開發技術是非常必要的。本教程將圍繞一個小Demo初步與大家一同探討WiFi開發。
先上效果圖
Demo功能比較簡單,四個按鈕、兩個文本和一個列表。功能主要有創建WiFi熱點,關閉WiFi熱點,搜索WiFi,連接WiFi,數據通訊。源碼會在教程結尾提供。
本章節主要介紹WiFi熱點的創建和關閉
需要用到的權限
Android6.0以上的系統別忘了動態申請權限
<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();
}
}