检测是否在 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 内部使用(例如 here 但 getAlwaysOnVpnPackage
似乎没有公开可用 AFAICT)。
我见过的最佳选项是 ,它会告诉您当前是否有任何 VPN 连接处于活动状态,但这还不够,因为:
- 我不想了解临时 VPN 连接:我只对始终在线 VPN 连接感兴趣。
- 有时 'always-on' 连接实际上并不总是打开。如果您有一个断开的连接并将其设置为 'always-on',它就是这样配置的,并阻止所有其他 VPN 安装,但是没有创建网络连接(Android 显示一个持续的警告,它将您带到另一个应用程序激活连接)。因为没有连接,所以上述技术不起作用。我仍然需要检测这种情况,因为它仍然阻止我的 VPN 设置。
有什么方法可以检查设备当前是否配置了 VPN 'always-on'?
最后,似乎这在我能找到的任何方式的普通设备上都是不可能的。如果您是设备管理员,我认为这是可能的,但这需要托管企业设备等。
目前,我通过观察近乎即时(小于 200 毫秒)的 VPN 设置失败(在 运行 startActivityForResult(vpnIntent)
和接收 onActivityResult
与 RESULT_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' 包含配置了永远在线的应用程序包名称。
我有一个 Android VPN 应用程序。当我触发启动 VPN 的意图时(通过 VPNService.prepare),如果设备上已经配置了永远在线的 VPN,它会立即失败。这似乎很合理,但我希望能够轻松检测到这种情况,以便向用户显示有用的消息。
'always on' 我的意思是特定的 VPN 永远在线 Android VPN 标志:https://developer.android.com/guide/topics/connectivity/vpn#always-on
我似乎找不到访问该信息的方法,即使它在 Android 内部使用(例如 here 但 getAlwaysOnVpnPackage
似乎没有公开可用 AFAICT)。
我见过的最佳选项是
- 我不想了解临时 VPN 连接:我只对始终在线 VPN 连接感兴趣。
- 有时 'always-on' 连接实际上并不总是打开。如果您有一个断开的连接并将其设置为 'always-on',它就是这样配置的,并阻止所有其他 VPN 安装,但是没有创建网络连接(Android 显示一个持续的警告,它将您带到另一个应用程序激活连接)。因为没有连接,所以上述技术不起作用。我仍然需要检测这种情况,因为它仍然阻止我的 VPN 设置。
有什么方法可以检查设备当前是否配置了 VPN 'always-on'?
最后,似乎这在我能找到的任何方式的普通设备上都是不可能的。如果您是设备管理员,我认为这是可能的,但这需要托管企业设备等。
目前,我通过观察近乎即时(小于 200 毫秒)的 VPN 设置失败(在 运行 startActivityForResult(vpnIntent)
和接收 onActivityResult
与 RESULT_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' 包含配置了永远在线的应用程序包名称。