我在 Android 网站上看到很多关于 local Only Hotspot
的参考资料但是,我需要从后台服务以编程方式管理蜂窝热点,就像我可以从下拉菜单中手动执行的操作一样。
过去这样做是这样的:
method = wifiManager.getClass().getDeclaredMethod("setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
method.invoke(wifiManager, wifiConfiguration, activated);
但是此功能已被弃用。
我的无线提供商 (AT&T) 尝试根据连接的设备和连接方式向我收取不同的费用。网络应该与设备无关,并且只将我的数据包传输到目的地。我希望这没有关系,但我担心我们失去对设备的控制。
Android真的不提供简单的API调用来管理热点吗?
只有特权应用程序才能在 Android 中启用/禁用热点。如果您碰巧正在开发这样的应用程序(或拥有 root 权限的设备),您可以使用以下 API。
如果使用Android版本> = 11
您可以使用
TetheringManager#startTethering
代码这里启动热点。这是官方文档中有关使用的示例。
同样,还有一个
TetheringManager#stopTethering
方法,代码为 here。这将停止热点。
如果使用Android版本< 11
ConnectivityManager#startTethering
可以与代码详细信息这里一起使用。同样,还有一个 ConnectivityManager#stopTethering
方法,代码为 here。
您的应用程序需要以下两项权限(仅适用于系统应用程序):
一旦获得了这些权限,您可以尝试以下操作 (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 测试了此代码。您的情况可能会有所不同。