Android 2.2的wifi热点API

24

我需要在Android 2.2(Froyo)中进行哪个API调用,才能创建一个无线热点(就像在“网络共享与便携式热点”设置项中看到的那样)。


我仍然无法相信没有激活/停用网络共享的API。希望它存在,只是尚未记录。 - Sney
它有文档记录:http://www.androidjavadoc.com/2.3/android/net/wifi/WifiManager.html 只是不是官方API的一部分。 - Bart Friederichs
3个回答

42
您可以使用反射调用 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会导致我得到一个空的配置。为什么?


2
@MatrixFrog:从战术上讲,它可能会在当前设备上出现问题。设备制造商非常愿意代表运营商删除或更改此功能。假设任何非SDK代码都可以工作,甚至存在,是不可靠的。如果您想将此代码用于自己手机上使用的某个玩具应用程序,请随意。然而,只有傻瓜才会发布旨在让客户失望的应用程序。从战略上讲,越来越多的开发人员超越SDK,我和其他人说服制造商不要搞乱SDK中应该支持的东西就越困难。 - CommonsWare
5
对于嵌入式应用程序而言,使用特定的固件和特定的设备,并不在应用市场上发布该应用程序是完全可以的。 - Lars D
1
我可能也会采用这种方法(因为我将我的应用程序与设备捆绑在一起,并完全控制设备上运行的版本)。SDK通常没有充分的理由限制其API-正如在Google Android开发组中讨论的那样,已经有很多例子。不幸的是,反射是处理它的唯一方法,只要它适用于您自己的特定用例,我认为就可以使用它。 - Mathias Conradt
有没有办法通过反射查看你正在调用的方法的实现。例如,在这里 https://android.googlesource.com/platform/frameworks/base/+/5320e896e235564321daaa5d9f0a540cf2ca44c4%5E/wifi/java/android/net/wifi/WifiManager.java 中,该方法甚至没有列出。 - Pascal Klein
1
@PascalKlein,不知道你指的是哪个提交,但你可以在当前的Froyo版本中找到该方法:https://android.googlesource.com/platform/frameworks/base/+/froyo-release/wifi/java/android/net/wifi/WifiManager.java - markov00
显示剩余11条评论

4

这适用于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();
        }
    }
}

那么在将当前配置置空后,它会接受您的WifiConfig吗? - bk138
@dmmh,通过添加“method.invoke(wifi,null,true);”是真的吗?这样我只需要将布尔值更改为“false”即可关闭它?那么如何检查它当前的状态是否打开/关闭? - gumuruh

2
很抱歉,似乎没有创建WiFi热点的API调用 - 抱歉!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接