我需要在Android 2.2(Froyo)中进行哪个API调用,才能创建一个无线热点(就像在“网络共享与便携式热点”设置项中看到的那样)。
private boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled)
方法。在获取 WifiManager
后,使用反射获取声明的方法,并查找此方法名称 setWifiApEnabled
并通过 WifiManager
对象调用它。这些API被标记为@hide,因此目前不能直接使用它们,但它们出现在WifiManager的AIDL上,因此可以访问!一个示例可以是:WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
Method[] wmMethods = wifi.getClass().getDeclaredMethods();
for(Method method: wmMethods){
if(method.getName().equals("setWifiApEnabled")){
WifiConfiguration netConfig = new WifiConfiguration();
netConfig.SSID = "\"PROVAAP\"";
netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
try {
method.invoke(wifi, netConfig,true);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
代码可以运行,但我无法使用自己的配置更改当前的配置,并获取一个已激活AP的当前WifiConfiguration会导致我得到一个空的配置。为什么?
这适用于API 8及以上版本。我使用的版本与下面(或上面)的版本有很大不同,遇到了markov00遇到的同样问题;无法加载便携式Wi-Fi AP的默认WifiConfiguration。我在其他地方找到了解决方案。
如果您喜欢这个解决方案,希望它被接受为答案。
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
Method[] wmMethods = wifi.getClass().getDeclaredMethods();
for (Method method: wmMethods){
if (method.getName().equals("setWifiApEnabled")){
try {
// just nullify WifiConfiguration to load the default configuration ;)
method.invoke(wifi, null, true);
} catch (IllegalArgumentException e){
e.printStackTrace();
} catch (IllegalAccessException e){
e.printStackTrace();
} catch (InvocationTargetException e){
e.printStackTrace();
}
}
}