Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测是否在Android上配置了常开VPN_Android_Network Programming_Vpn - Fatal编程技术网

检测是否在Android上配置了常开VPN

检测是否在Android上配置了常开VPN,android,network-programming,vpn,Android,Network Programming,Vpn,我有一个Android VPN应用程序。当我触发启动VPN(via)的意图时,如果设备上已经配置了一个始终开启的VPN,它将立即失败。这似乎是合理的,但我希望能够轻松地检测到这种情况,以便向用户显示有用的消息 “始终开启”是指特定的VPN始终开启Android VPN标志: 我似乎找不到访问该信息的方法,即使它在Android内部使用(例如,getAlwaysOnVpnPackage似乎不公开) 我见过的最好的选择是,它将告诉您当前是否有任何VPN连接处于活动状态,但这还不够,因为: 我不想知

我有一个Android VPN应用程序。当我触发启动VPN(via)的意图时,如果设备上已经配置了一个始终开启的VPN,它将立即失败。这似乎是合理的,但我希望能够轻松地检测到这种情况,以便向用户显示有用的消息

“始终开启”是指特定的VPN始终开启Android VPN标志:

我似乎找不到访问该信息的方法,即使它在Android内部使用(例如,
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网络连接的信息。我添加了更多的细节来尝试澄清这一点。好的,您需要成为设备所有者/管理员才能获得此信息。