在一些网络需求中,为了防止用户抓包,往往采用检测用户当前网络是不是VPN上网的手段。但是依照国内网上的写法,测试中发现根本就没有用。所以经过一段时间的查询之后,找到了解决方法。

以往的写法

/* *
* 判断设备 是否使用代理上网
*/
private boolean isWifiProxy(Context context) {
    final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
    String proxyAddress;
    int proxyPort;
    if (IS_ICS_OR_LATER) {
        proxyAddress = System.getProperty("http.proxyHost");
        String portStr = System.getProperty("http.proxyPort");
        proxyPort = Integer.parseInt((portStr != null ? portStr : "-1"));
    } else {
        proxyAddress = android.net.Proxy.getHost(context);
        proxyPort = android.net.Proxy.getPort(context);
    }
    return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);
}

现在的新写法

注意:使用该写法容易产生一刀切的问题,但是目前没有找到很好的解决方案,因此只能将就用一下

/**
* 检测用户是否使用VPN代理上网抓包
* @param context 上下文
* @return vpn使用结果
*/
public static boolean isVpnProxy(final Context context) {
    ConnectivityManager connMgr = (ConnectivityManager)
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
    boolean isVpnConn = false;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        for (Network network : connMgr.getAllNetworks()) {
            NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
            if (networkInfo.getType() == ConnectivityManager.TYPE_VPN) {
                isVpnConn |= networkInfo.isConnected();
            }
        }
    }
    return isVpnConn;
}