【问题标题】:Android 2.2 wifi hotspot APIAndroid 2.2 wifi热点API
【发布时间】:2011-03-02 16:21:00
【问题描述】:

我需要在 Android 2.2 (Froyo) 中调用什么 API 来创建 Wifi 热点(如网络共享和便携式热点设置项中所示)。

【问题讨论】:

标签: java android wifi hotspot


【解决方案1】:

你可以打电话

private boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled);

使用反射:)

得到WifiManager后使用反射得到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 会将我驱动为空配置。为什么?

【讨论】:

  • 您可以随时通过反射访问它们!
  • @MatrixFrog:从战术上讲,它可能会在当前设备上中断。设备制造商非常愿意代表运营商删除或更改此功能。假设任何非 SDK 代码都可以工作,甚至存在,这根本不可靠。如果您想将此代码用于您在自己手机上使用的某些玩具应用程序,请成为我的客人。但是,只有傻瓜才会发布旨在让客户失望的应用程序。从战略上讲,越多的开发人员越过 SDK,我和其他人就越难以说服制造商不要搞砸应该在 SDK 中支持的东西。
  • @CommonsWare:对于嵌入式应用,使用特定的固件和特定的设备是完全可以的,而不是在应用市场上发布应用。
  • 我也可能会采用这种方法(因为我将我的应用程序与设备捆绑在一起,并且完全控制设备上运行的版本)。 SDK 经常无缘无故地限制它的 API——Google Android 开发组已经讨论了很多例子。不幸的是,反射是处理它的唯一方法,我会说只要它适用于您自己的特定用例即可。
  • @PascalKlein 不知道您指的是什么提交,但您可以在当前的 froyo 版本中找到该方法:android.googlesource.com/platform/frameworks/base/+/…
【解决方案2】:

这适用于 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?
  • @dmmh,添加“method.invoke(wifi, null, true);”是真的吗?它已启用。所以我只是将布尔值更改为“false”以将其关闭?如何检查它的当前状态是否打开/关闭?
【解决方案3】:

似乎没有用于创建 WiFi 热点的 API 调用——抱歉!

【讨论】:

    猜你喜欢
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多