Android API 21+中VPN的网络信息

3

我的问题很简单,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;
    }

始终返回null。对于WIFI或移动网络可以正常工作。

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

2个回答

6

NetworkCapabilities 适用于API21+。您需要遍历所有现有的网络,并检查哪个具有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。 - Mygod

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接