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

问题描述 投票:0回答:2

我在 Android 网站上看到很多关于 local Only Hotspot

的参考资料

但是,我需要从后台服务以编程方式管理蜂窝热点,就像我可以从下拉菜单中手动执行的操作一样。

过去这样做是这样的:

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

但是此功能已被弃用。

我的无线提供商 (AT&T) 尝试根据连接的设备和连接方式向我收取不同的费用。网络应该与设备无关,并且只将我的数据包传输到目的地。我希望这没有关系,但我担心我们失去对设备的控制。

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

java android android-wifi wifimanager android-developer-api
2个回答
1
投票

只有特权应用程序才能在 Android 中启用/禁用热点。如果您碰巧正在开发这样的应用程序(或拥有 root 权限的设备),您可以使用以下 API。

如果使用Android版本> = 11

您可以使用

TetheringManager#startTethering
代码这里启动热点。这是官方文档中有关使用的示例

同样,还有一个

TetheringManager#stopTethering
方法,代码为 here。这将停止热点。

如果使用Android版本< 11

ConnectivityManager#startTethering
可以与代码详细信息这里一起使用。同样,还有一个
ConnectivityManager#stopTethering
方法,代码为 here


0
投票

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

  • 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,请使用与上面相同的代码,但将 'tether' 替换为 'untether'。

我仅针对 Android 11 测试了此代码。您的情况可能会有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.