簡介
Android(4.4)的Wi-Fi子系統目前支持三種工作模式:
- Station
- Access Point
- Wi-Fi Direct
對於某些設備來說,可能需要Wi-Fi開機就進入到AP(Access Point)模式,然后扮演一個共享熱點的角色。
WifiManager類是Android開放給應用開發者的主要接口,里面提供了Station和AP模式下的常用函數,AP相關的主要有(這些目前是隱藏的,未對應用開發者開放出來):
- setWifiApEnabled
- getWifiApState
- isWifiApEnabled
- getWifiApConfiguration
- setWifiApConfiguration
有關這些接口的詳細用法,可以參見代碼中的“framework/base/wifi/java/android/net/wifi/WifiManager.java”。
要在開機過程中開啟AP模式的話,我們只需要在一個合適的地方(比如ConnecitivityService.java)調用WifiManager就可以了。
修改步驟
ConnectivityService是Android的連接管理服務,它由SystemServer啟動,負責各個網絡的連接策略管理,以及網絡分享(Tether)等。我們在其構造函數的最后加上我們的邏輯即可。
import android.net.wifi.WifiManager; import android.net.wifi.WifiConfiguration; // 構造函數中啟動AP public ConnectivityService(Context context, INetworkManagementService netd, INetworkStatesService statsService, INetworkPolicyManager policyManager) { this(context, netd, statsService, policyManager, null); // 啟動AP模式 final WifiManager mWifimanager; final WifiConfiguration mWifiConfig; mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); mWifiConfig = mWifiManager.getWifiApConfiguration(); mWifiManager.setWifiApEnabled(mWifiConfig, true); }
以下兩個文件中也有相關操作,可以參考一下:
- packages/apps/Setttings/src/com/android/settings/wifi/WifiApEnabler.java
- packages/apps/Setttings/src/com/android/settings/TetherSettings.java
引入問題
由於在ConnectivityService里偷偷啟動了AP模式,Settings啟動后,“無線熱點”中的CheckBox的狀態會與真實狀態不同步。需要對CheckBox根據getWifiApState做初始化動作。