检测是否在Android上配置了常开VPN
我有一个Android VPN应用程序。当我触发启动VPN(via)的意图时,如果设备上已经配置了一个始终开启的VPN,它将立即失败。这似乎是合理的,但我希望能够轻松地检测到这种情况,以便向用户显示有用的消息 “始终开启”是指特定的VPN始终开启Android VPN标志: 我似乎找不到访问该信息的方法,即使它在Android内部使用(例如,检测是否在Android上配置了常开VPN,android,network-programming,vpn,Android,Network Programming,Vpn,我有一个Android VPN应用程序。当我触发启动VPN(via)的意图时,如果设备上已经配置了一个始终开启的VPN,它将立即失败。这似乎是合理的,但我希望能够轻松地检测到这种情况,以便向用户显示有用的消息 “始终开启”是指特定的VPN始终开启Android VPN标志: 我似乎找不到访问该信息的方法,即使它在Android内部使用(例如,getAlwaysOnVpnPackage似乎不公开) 我见过的最好的选择是,它将告诉您当前是否有任何VPN连接处于活动状态,但这还不够,因为: 我不想知
getAlwaysOnVpnPackage
似乎不公开)
我见过的最好的选择是,它将告诉您当前是否有任何VPN连接处于活动状态,但这还不够,因为:
- 我不想知道临时VPN连接:我只感兴趣的是,它是一个始终在线的VPN连接
- 有时“始终打开”连接实际上并不总是打开。如果您有一个断开的连接并将其设置为“始终打开”,则会将其配置为“始终打开”,并阻止所有其他VPN安装,但不会创建网络连接(Android会显示一个持续警告,它会将您带到其他应用程序以激活连接)。因为没有连接,上述技术不起作用。我仍然需要检测这种情况,因为它仍然阻止我的VPN设置
是否有任何方法可以检查设备当前是否有一个配置为“始终开启”的VPN?最后,在正常设备上,这似乎是我无法找到的。我认为如果你是一名设备管理员,这是可能的,但这需要管理企业设备等 目前,我通过观察近瞬间(小于200ms)VPN设置失败(在运行
startActivityForResult(vpnIntent)
和接收onActivityResult
和RESULT\u Cancelled
之间)来处理此问题,然后在这种情况下显示一条有用的消息
完全实现是为了防止您尝试执行相同的操作。您可以使用此方法
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”包含配置为“始终打开”的应用程序的程序包名称。这是由于涉及多个问题而关闭的,我认为这是对问题的误解。这里有几个例子,但它们都是同一个问题的例子:我想访问有关当前VPN配置的信息,而不是活动VPN网络连接的信息。我添加了更多的细节来尝试澄清这一点。好的,您需要成为设备所有者/管理员才能获得此信息。