如何在不使用意图连接到VPN服务的情况下以编程方式检测流量是否通过VPN。有没有系统调用?
答案 0 :(得分:3)
这有效:
private boolean checkVPN() {
ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getNetworkInfo(ConnectivityManager.TYPE_VPN).isConnectedOrConnecting();
}
答案 1 :(得分:1)
Android操作系统知道VPN连接何时处于活动状态(因为它在VPN连接期间在状态栏中显示一个图标)但是没有公共API方法(可以在VpnService上显示)来检查用于主动连接。
出现两种解决方案。如果您正在处理您了解网络拓扑的特定情况,请运行“ping”以查看特定IP地址是否可用 - 使用System.exec
。 ping命令存在于具有库存ROM的Android设备上,我已将其用作解决方案的一部分,以提供更精细的数据连接状态视图(未分配IP地址,已分配的IP地址但无法访问互联网,可以访问互联网)
更好的解决方案是运行traceroute而不是分析输出。我没有检查带有库存ROM的Android设备上是否存在traceroute,我将在稍后编辑此答案并提供更完整的信息。
答案 2 :(得分:0)
可以在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;
}
答案 3 :(得分:0)
我猜想对于大多数用例,您要检查正在使用的网络是否正在使用VPN,而不是仅任何个可用网络正在使用VPN。
connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_VPN)
...正在返回 可用VPN网络的NetworkInfo。这可能不是活动的网络!相反,您可以使用以下代码片段测试活动网络是否正在使用VPN:
Network activeNetwork = connectivityManager.getActiveNetwork();
NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(activeNetwork);
boolean vpnInUse = caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
答案 4 :(得分:0)
您可以在android中使用以下代码检测VPN。代码将在新旧版本的android中工作。下面的代码在Kotlin中。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if(checkVPNStatus()) {
Log.d("VPN-RAJ", "is VPN Connected YES")
} else {
Log.d("VPN-RAJ", "is VPN Connected NO")
}
}
private fun checkVPNStatus(): Boolean {
val connectivityManager = this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
val network = connectivityManager.activeNetwork
val capabilities = connectivityManager.getNetworkCapabilities(network)
Log.d("VPN-RAJ", "in New Android Version")
capabilities!= null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
} else {
Log.d("VPN-RAJ", "in Old Android Version")
connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_VPN)!!.isConnectedOrConnecting
}
}
}