Android WiFi開發教程(一)——WiFi熱點的創建與關閉

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

跟創建WiFI熱點一樣,關閉的時候同樣需要用到Java的反射機制。在調用Method的invoke方法時,將最後一個參數改成false就可以了。

相對來說,WiFi熱點的創建與關閉還是比較簡單的。歡迎繼續閱讀下一篇Android WiFi開發教程(二)——WiFi的搜索和連接

發佈了32 篇原創文章 · 獲贊 111 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章