【问题标题】:NetworkInfo for VPN on Android API 21+Android API 21+ 上 VPN 的 NetworkInfo
【发布时间】:2015-04-02 17:41:41
【问题描述】:

我的问题很简单,Android 支持以编程方式检查 VPN 是否处于活动状态(在 API 21+ 上)参考:http://developer.android.com/reference/android/net/ConnectivityManager.html#TYPE_VPN

我以为我知道它应该如何工作,但是代码(使用 roboguice):

@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;
    }

总是返回空值。对于 WIFI 或 MOBILE 效果很好。

这是一个错误吗?还是我做错了什么?还是我误解了它应该如何工作?

【问题讨论】:

    标签: android android-5.0-lollipop vpn


    【解决方案1】:

    NetworkCapabilities 将适用于 API 21+。您必须遍历所有现有网络并检查哪个有VPN_TRANSPORT

    ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    Network[] networks = cm.getAllNetworks();
    
    Log.i(TAG, "Network count: " + networks.length);
    for(int i = 0; i < networks.length; i++) {
    
      NetworkCapabilities caps = cm.getNetworkCapabilities(networks[i]);
    
      Log.i(TAG, "Network " + i + ": " + networks[i].toString());
      Log.i(TAG, "VPN transport is: " + caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN));
      Log.i(TAG, "NOT_VPN capability is: " + caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN));
    
    }
    

    【讨论】:

    • @TheRealChx101 没有达到 API 27。
    【解决方案2】:

    如果您想检查当前活动的网络是否正在使用 VPN,您可以使用:

    Network activeNetwork = connectivityManager.getActiveNetwork();
    NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(activeNetwork);
    boolean vpnInUse = caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多