如何在Android上以编程方式启用/禁用热点或共享模式



我在Android的网站上看到了许多关于本地Only Hotspot 的参考资料

然而,我需要从后台服务以编程方式管理蜂窝热点,就像我可以从下拉菜单手动管理一样。

这以前是这样做的:

method = wifiManager.getClass().getDeclaredMethod("setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
method.invoke(wifiManager, wifiConfiguration, activated);

但是,此功能已被弃用。

我的无线服务提供商(AT&T(正试图根据连接的设备和方式向我收取不同的费用。网络应该对设备是不可知的,只需将我的数据包传输到它们的目的地。我希望这与此无关,但我担心我们会失去对设备的控制。

Android真的不提供简单的API调用来管理热点吗?

只有特权应用程序才能在Android中启用/禁用热点。如果你碰巧正在开发这样一个应用程序(或者有一个根设备(,你可以使用以下API。

如果使用Android版本>=11

您可以在此处使用TetheringManager#startTethering代码启动热点。

类似地,这里有一个TetheringManager#stopTethering方法的代码。这将停止热点。

如果使用Android版本<11

ConnectivityManager#startTethering可用于此处的代码详细信息。同样,这里也有一个带有代码的ConnectivityManager#stopTethering方法。

您的应用程序需要以下两个权限(仅适用于系统应用程序(:

  • android.permission.TETHER_PRIVILEGED
  • android.permission.WRITE_SETTINGS

一旦你获得了这些权限,你可以尝试以下(kotlin(:

fun startTethering(ctx: Context) {
  val o = ctx.getSystemService(Context.CONNECTIVITY_SERVICE)
  for (m in o.javaClass.methods) {
    if (m.name.equals("tether")) {
      try {
        m.invoke(o, "eth0") // or whatever you know the iface to be
      } catch (e: IllegalArgumentException) {
        e.printStackTrace()
      } catch (e: IllegalAccessException) {
        e.printStackTrace()
      } catch (e: InvocationTargetException) {
        val target = e.targetException
        Log.e("tethering", "target: ${target.message}")
        e.printStackTrace()
      }
    }
  }
}

如果您想让代码解开iface,请使用与上面相同的代码,但将"系绳"替换为"解开"。

我只在安卓11上测试过这个代码。您的里程数可能有所不同。

相关内容

  • 没有找到相关文章

最新更新