android - 如何在 Android 8.0 (Oreo) 中以编程方式打开/关闭 wifi 热点

标签 android android-wifi hotspot android-8.0-oreo

我知道如何使用以下方法在 android 中使用反射打开/关闭 wifi 热点。

private static boolean changeWifiHotspotState(Context context,boolean enable) {
        try {
            WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            Method method = manager.getClass().getDeclaredMethod("setWifiApEnabled", WifiConfiguration.class,
                    Boolean.TYPE);
            method.setAccessible(true);
            WifiConfiguration configuration = enable ? getWifiApConfiguration(manager) : null;
            boolean isSuccess = (Boolean) method.invoke(manager, configuration, enable);
            return isSuccess;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

但是上面的方法在Android 8.0(Oreo)上不行。

当我在 Android 8.0 中执行上述方法时,我在 logcat 中得到以下语句。

com.gck.dummy W/WifiManager: com.gck.dummy attempted call to setWifiApEnabled: enabled = true

在android 8.0上有没有其他方法可以打开/关闭热点

最佳答案

我认为 LocalOnlyHotspot 路线是通往的方式,但正如@edsappfactory.com 在评论中所说 - 它只提供封闭的网络,没有互联网访问。

在 Oreo 中,热点/网络共享移至 ConnectionManager,其注释为 @SystemApi,因此(名义上)无法访问。

作为我正在做的其他事情的一部分,我制作了一个应用程序并将其放在 github here .它使用反射来获取函数和DexMaker生成 ConnectionManager.OnStartTetheringCallback 的子类(这也是不可访问的)。

认为这一切都很好 - 边缘有点粗糙,所以请随时改进!

相关代码在:

我失去了耐心,试图让我的 DexMaker 生成的回调触发 MyOnStartTetheringCallback所以所有的代码都乱七八糟并被注释掉了。

关于android - 如何在 Android 8.0 (Oreo) 中以编程方式打开/关闭 wifi 热点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45984345/

相关文章:

android - 在 Android 中的三个 Activity 之间传递包

android - Cocos2D Touch 帮助

android - 如何在事件发生后重新聚焦 <TextInput>?

android - 使用RelativeLayout 和SurfaceView 进行TranslateAnimation

java - 无法从后台服务通过 WiFi 访问互联网

安卓 M : Unable to remove WIFI AP programmatically

android - 在android中设置wifi配置的优先级

android - 我如何在应用程序中获取我设备在 android 上的热点接入点的 BSSID

ios - 个人热点打破 UI 布局

java - Hotspot VM 如何生成字符串oops 和镜像oops?