You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用中如何检测VPN是否启用?解决无法查看VPN状态问题

嘿,我来帮你搞定Android设备VPN状态检测的问题!不同Android版本对应的API不一样,我整理了几种靠谱的适配方案,你可以根据自己的目标版本来选:

方法一:Android 10(API 29)及以上版本推荐方案

从Android 10开始,官方推荐使用NetworkCapabilities来检测网络状态,包括VPN连接情况。步骤如下:

  1. 添加权限:在AndroidManifest.xml中声明网络状态权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  1. 检测VPN状态的代码实现:
import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkCapabilities

fun isVpnEnabled(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val activeNetwork = connectivityManager.activeNetwork ?: return false
    val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) ?: return false
    
    return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
}

这个方法会直接返回当前是否有VPN连接处于活跃状态,准确性很高。

方法二:Android 10以下版本的兼容方案

对于API 29以下的版本,我们可以用ConnectivityManager.getNetworkInfo()方法(虽然这个方法已经被标记为废弃,但在旧版本上依然可以正常工作):

  1. 同样需要添加ACCESS_NETWORK_STATE权限(和上面一致)

  2. 兼容代码实现:

import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkInfo

@Suppress("DEPRECATION")
fun isVpnEnabledLegacy(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_VPN)
    
    return networkInfo != null && networkInfo.isConnected
}

如果你的应用需要兼容Android 9及以下版本,可以用这个方法,或者结合两种方案做版本判断:

fun isVpnEnabled(context: Context): Boolean {
    return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
        // 调用API29+的检测方法
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val activeNetwork = cm.activeNetwork ?: return false
        val capabilities = cm.getNetworkCapabilities(activeNetwork) ?: return false
        capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
    } else {
        // 调用旧版本兼容方法
        @Suppress("DEPRECATION")
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        @Suppress("DEPRECATION")
        val networkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_VPN)
        networkInfo != null && networkInfo.isConnected
    }
}
一些注意事项
  • 有些第三方VPN应用可能使用非系统级的实现(比如基于代理的轻量VPN),这种情况下可能无法被上述方法检测到,但绝大多数正规VPN都会使用系统级的VPN通道,所以这个方法覆盖了大部分场景。
  • 确保你的应用已经获取了ACCESS_NETWORK_STATE权限,在Android 6及以上版本,还需要动态申请这个权限(如果你的targetSdkVersion >=23的话)。

内容的提问来源于stack exchange,提问作者Bharat Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:06:57