TomPax
TomPax

Reputation: 120

NetworkInfo for VPN on Android API 21+

My question is simple, Android supports programmatically check if VPN is active (on API 21+) refers to: http://developer.android.com/reference/android/net/ConnectivityManager.html#TYPE_VPN

I thought I knew how does it should work but code (using 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;
    }

always returns null. For WIFI or MOBILE works well.

Is it a bug? Or Am I doing something wrong? Or I misunderstand how does it should work?

Upvotes: 3

Views: 2852

Answers (2)

Almer
Almer

Reputation: 1199

If you want to check if the currently active Network is using VPN, you could use:

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

Upvotes: 1

Isaac Madwed
Isaac Madwed

Reputation: 1006

NetworkCapabilities will work on API 21+. You have to loop over all existing networks and check which has 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));

}

Upvotes: 6

Related Questions