【问题标题】:Detect if an always-on VPN is configured on Android检测是否在 Android 上配置了永远在线的 VPN
【发布时间】:2021-05-02 18:21:00
【问题描述】:

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

“永远在线”是指特定的 VPN 永远在线 Android VPN 标志:https://developer.android.com/guide/topics/connectivity/vpn#always-on

我似乎找不到访问该信息的方法,即使它在 Android 内部使用(例如 here,但 getAlwaysOnVpnPackage 似乎并未公开提供 AFAICT)。

我见过的最佳选择是Check if a VPN connection is active in Android?,它会告诉您当前是否有任何 VPN 连接处于活动状态,但这还不够,因为:

  • 我不想了解临时 VPN 连接:我只对 始终在线 VPN 连接感兴趣。
  • 有时“始终在线”连接实际上并不总是在线。如果您的连接断开并将其设置为“始终在线”,则它已配置为这样,并阻止所有其他 VPN 安装,但没有创建网络连接(Android 会显示持续警告,这会将您带到另一个应用程序激活连接)。因为没有连接,所以上述技术不起作用。我仍然需要检测这种情况,因为它仍然会阻止我的 VPN 设置。

有什么方法可以检查设备当前是否有配置为“始终在线”的 VPN?

【问题讨论】:

  • 由于涉及多个问题而关闭,我认为这是对问题的误解。这里有几个示例,但它们是同一个问题的示例:我想访问有关当前 VPN 配置的信息,而不是活动的 VPN 网络连接。我添加了更多细节来尝试澄清这一点。
  • AFAIK,您需要成为设备所有者/管理员才能获取此信息。

标签: android network-programming vpn


【解决方案1】:

你可以用这个方法

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' 包含配置了永远在线的应用程序包名称。

【讨论】:

    【解决方案2】:

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

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

    完整的实现在https://github.com/httptoolkit/httptoolkit-android/commit/928fbf92a4f868042789471be0d42800a226194b,以防你尝试做同样的事情。

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      相关资源
      最近更新 更多