如何以编程方式检测流量是否会通过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