检测是否在 Android 上配置了永远在线的 VPN

Detect if an always-on VPN is configured on Android

我有一个 Android VPN 应用程序。当我触发启动 VPN 的意图时(通过 VPNService.prepare),如果设备上已经配置了永远在线的 VPN,它会立即失败。这似乎很合理,但我希望能够轻松检测到这种情况,以便向用户显示有用的消息。

'always on' 我的意思是特定的 VPN 永远在线 Android VPN 标志:https://developer.android.com/guide/topics/connectivity/vpn#always-on

我似乎找不到访问该信息的方法,即使它在 Android 内部使用(例如 heregetAlwaysOnVpnPackage 似乎没有公开可用 AFAICT)。

我见过的最佳选项是 ,它会告诉您当前是否有任何 VPN 连接处于活动状态,但这还不够,因为:

有什么方法可以检查设备当前是否配置了 VPN 'always-on'?

最后,似乎这在我能找到的任何方式的普通设备上都是不可能的。如果您是设备管理员,我认为这是可能的,但这需要托管企业设备等。

目前,我通过观察近乎即时(小于 200 毫秒)的 VPN 设置失败(在 运行 startActivityForResult(vpnIntent) 和接收 onActivityResultRESULT_CANCELED) 然后在这种情况下显示有用的消息。

完整的实现在 https://github.com/httptoolkit/httptoolkit-android/commit/928fbf92a4f868042789471be0d42800a226194b 中,以防您尝试这样做。

你可以用这个方法

private fun isVpnAlwaysOn(): Boolean {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
        val alwaysOn = Settings.Secure.getString(contentResolver, "always_on_vpn_app")
        return !alwaysOn.isNullOrEmpty()
    } else false
}

'alwaysOn' 包含配置了永远在线的应用程序包名称。