检测背后VPN在android系统(Detect behind VPN in android)

2019-09-01 20:47发布

如何以编程方式检测流量是否会通过VPN不使用意图连接到VPNService。 有一些系统调用?

Answer 1:

这工作:

private boolean checkVPN() {
    ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
    return cm.getNetworkInfo(ConnectivityManager.TYPE_VPN).isConnectedOrConnecting();
}


Answer 2:

Android操作系统是知道当VPN连接处于活动状态(因为它显示一个图标在VPN连接的时间状态栏),但不存在(这将出现在VpnService)公共API方法来检查活动的连接。

两种解决方案出现。 如果你正在处理,你知道网络拓扑结构的具体情况,执行“ping”,看是否有特定的IP地址可用-使用System.exec 。 ping命令存在于与股票ROM的Android装置中,我使用它作为一个解决方案的一部分,以提供一个数据连接(IP地址的状态的一个更精细的视图中未分配的,IP地址分配,但不能访问互联网,可以访问互联网)

一个更好的解决办法是运行跟踪路由,而不是和分析输出。 我没有检查是否traceroute的存在与股票ROM的Android设备,我会更完整的信息,这个答案以后编辑。



Answer 3:

它可以检查它在Android的API 21的高,但似乎不工作(在Nexus 5 @ 5.0.1的Nexus 7 @ 5.0.2)。 为什么它不工作?

对于检查它新的API的片段(和所有流量通过VPN路由如果连接):

@Inject
boolean checkVPN(ConnectivityManager connMgr) {
    //don't know why always returns null:
    NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_VPN);

    boolean isVpnConn = networkInfo == null ? false : networkInfo.isConnected();
    return isVpnConn;
}


Answer 4:

我猜你想,如果积极利用网络使用VPN,而不是只如果任何可用的网络使用VPN来检查大多数使用情况。

connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_VPN)

......在返回的NetworkInfo 一个可用的VPN网络。 这可能不是活动的网络! 相反,你可以使用下面的代码片段在活动网络使用VPN来进行测试:

Network activeNetwork = connectivityManager.getActiveNetwork();
NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(activeNetwork);
boolean vpnInUse = caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);


文章来源: Detect behind VPN in android