最近在做一個小的應用,需要通過程式設定安卓手機的AP(Access point, 即將手機變為一個行動熱點,其他機器能夠通過wifi串連到此手機)。原以為很簡單的一個東西,還是花費了一番周折,最終還是搞定了。
配置AP的選項是屬於配置wifi的一部分,所以他們都在WifiManager這個類中。擷取當前系統的WifiManager執行個體的方法是:
1 |
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
|
此類中有幾個關鍵方法用來設定AP,但是它們都是被隱藏的,我們無法直接調用,所以只有通過反射的方式來調用。
擷取AP目前狀態的方法是:
1234 |
private Boolean getApState(WifiManager wifi) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { Method method = wifi.getClass().getMethod("isWifiApEnabled"); return (Boolean) method.invoke(wifi); }
|
配置AP要使用到WifiConfiguration這個類,以下是設定的一個AP。
123456789101112 |
private WifiConfiguration getApConfiguration() { WifiConfiguration apConfig = new WifiConfiguration(); //配置熱點的名稱 apConfig.SSID = "yourId"; apConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); apConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); apConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); apConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); //配置熱點的密碼 apConfig.preSharedKey = "yourPassword"; return apConfig; }
|
應用AP配置並啟用AP要使用另一個被隱藏的方法setWifiApEnabled
。需要注意的是啟用AP前要將當前手機的wifi關閉,否則會啟動失敗。
123456789 |
private void setWifiAp() { Method method = wifi.getClass().getMethod( "setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE); wifi.setWifiEnabled(false); method.invoke(wifi, null, true); }
|
最後,一定要注意要在AndroidManifest.xml檔案中設定幾個許可權。否則在調用API時會產生java.lang.SecurityException: Permission Denied
的異常。需要加入的許可權如下:
1234 |
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
源碼我已經放置到github上了,需要的請自行checkout。地址是:https://github.com/huangbowen521/APSwitch