如何在不使用Intent连接到VPNService的情况下以编程方式检测流量是否通过VPN。是否有一些系统调用?
km0tfn4u1#
这是可行的:
private boolean checkVPN() { ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); return cm.getNetworkInfo(ConnectivityManager.TYPE_VPN).isConnectedOrConnecting(); }
q3qa4bjr2#
这是可能的检查它在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; }
7uzetpgm3#
Android操作系统知道VPN连接何时处于活动状态(因为它在VPN连接期间在状态栏中显示图标),但没有公共API方法(将出现在VpnService上)来检查活动连接。有两种解决方案。如果你正在处理一个特定的情况,你知道网络拓扑,运行'ping'来查看一个特定的IP地址是否可用-使用System.exec。ping命令存在于Android设备与股票ROM,我已经使用它作为一个解决方案的一部分,以提供一个数据连接状态的更细粒度的视图(ip地址未分配,ip地址已分配但不能上网,可以上网)一个更好的解决方案是运行traceroute并分析输出。我还没有检查traceroute是否存在于带有库存ROM的Android设备上,我将在稍后编辑此答案以提供更完整的信息。
System.exec
oxf4rvwz4#
您可以在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 } } }
rnmwe5a25#
我想对于大多数用例,您都希望检查 * 活跃 * 使用的网络是否正在使用VPN,而不是 * 任何 * 可用的网络是否正在使用VPN。
connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_VPN)
...正在返回 an 可用VPN网络的NetworkInfo。这可能不是活动网络!相反,您可以使用以下代码片段来测试活动网络是否正在使用VPN:
Network activeNetwork = connectivityManager.getActiveNetwork(); NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(activeNetwork); boolean vpnInUse = caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
hlswsv356#
没有什么对我有用,所以我创建了自己的。它在Android 11上对我有用(尽管已弃用)
static boolean checkVpn(Context context){ ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); for(NetworkInfo o:cm.getAllNetworkInfo()){ if(o.getTypeName().toLowerCase().contains("vpn")&&o.isConnected()){ return true; } } return false; }
6条答案
按热度按时间km0tfn4u1#
这是可行的:
q3qa4bjr2#
这是可能的检查它在Android API 21更高,但它似乎不工作(在Nexus 5@5.0.1,Nexus 7@5.0.2).为什么它不工作?
检查它的新API的片段(如果连接,所有流量都由vpn路由):
7uzetpgm3#
Android操作系统知道VPN连接何时处于活动状态(因为它在VPN连接期间在状态栏中显示图标),但没有公共API方法(将出现在VpnService上)来检查活动连接。
有两种解决方案。如果你正在处理一个特定的情况,你知道网络拓扑,运行'ping'来查看一个特定的IP地址是否可用-使用
System.exec
。ping命令存在于Android设备与股票ROM,我已经使用它作为一个解决方案的一部分,以提供一个数据连接状态的更细粒度的视图(ip地址未分配,ip地址已分配但不能上网,可以上网)一个更好的解决方案是运行traceroute并分析输出。我还没有检查traceroute是否存在于带有库存ROM的Android设备上,我将在稍后编辑此答案以提供更完整的信息。
oxf4rvwz4#
您可以在Android中使用以下代码检测VPN。代码将在新版本和旧版本的Android中工作。下面的代码是在Kotlin中。
rnmwe5a25#
我想对于大多数用例,您都希望检查 * 活跃 * 使用的网络是否正在使用VPN,而不是 * 任何 * 可用的网络是否正在使用VPN。
...正在返回 an 可用VPN网络的NetworkInfo。这可能不是活动网络!相反,您可以使用以下代码片段来测试活动网络是否正在使用VPN:
hlswsv356#
没有什么对我有用,所以我创建了自己的。它在Android 11上对我有用(尽管已弃用)