7

永远在线的 VPN 开关可以通过编程方式打开吗?

我已添加设备管理员权限。之后,我一直使用设备管理员进行设置

mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
    mDeviceAdminSample = new ComponentName(this, DeviceAdminReceiver.class);
    isAdminApp = mDPM.isAdminActive(mDeviceAdminSample);

    if (isAdminApp) {
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                mDPM.setAlwaysOnVpnPackage(mDeviceAdminSample,"", true);
            }
        } catch (PackageManager.NameNotFoundException namenotfoundexception) {
            namenotfoundexception.printStackTrace();
        } catch (Exception ex) {
        }
    }

但它并没有启用永远在线。

我添加了包名 insted

mDPM.setAlwaysOnVpnPackage(mDeviceAdminSample,"my.app.package.name", true);

但仍然没有启用开关。

那么这段代码在做什么呢?如何以编程方式启用它?

我希望这像下面的图片

永远在线的VPN

4

1 回答 1

3

根据docssetAlwaysOnVpnPackage只能由配置文件所有者(通常是工作配置文件上的 MDM 客户端)或设备所有者(对于完全托管的设备)使用:

由设备或配置文件所有者调用,以通过特定应用程序为当前用户配置始终开启的 VPN 连接。此连接会在重新启动后自动授予并保持。

作为个人资料用户- 我不希望我的 VPN 自行决定何时连接(如果实施正确,以编程方式设置始终开启将立即连接 VPN)。

作为工作资料用户(戴上员工的帽子),这不是我的决定,而是我的组织(通过资料所有者应用程序)的决定。

所以,总而言之,这种行为是有道理的。

更新:

您可以克隆、构建和调试 Google 的Test DPC应用程序,而不是实施 MDM,这可能需要大量工作,该应用程序具有以编程方式测试切换永远在线 VPN 所需的一切。

它还有数以百万计的其他东西,你不需要,所以一定要忽略其余的:)

我没有看过他们的代码,但我建议搜索setAlwaysOnVpnPackage函数的用法。

Google 的测试 DPC应用程序:

  • 链接到 Play 商店
  • 链接到 GitHub 存储库(自行构建和调试)
于 2021-07-19T12:16:59.947 回答