-1

I am trying to detect if VPN is running on the phone. I have implemented the below code, but it reports crashes on Firebase Crashlytics.

ConnectivityManager connectivityManager = (ConnectivityManager) activity.getSystemService(activity.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    @SuppressLint("MissingPermission")
    Network activeNetwork = connectivityManager.getActiveNetwork();
    @SuppressLint("MissingPermission")
    NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(activeNetwork);
    boolean vpnInUse = caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);

The crash reported is

Fatal Exception: java.lang.RuntimeException Unable to resume activity {com.my.app/com.my.app.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.net.NetworkCapabilities.hasTransport(int)' on a null object reference

How do I resolve this issue?

Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
Wasif
  • 61
  • 10
  • `caps` is `null`, what else we can insight... just make some preventing `if(caps!=null)`... – snachmsm Feb 18 '22 at 07:21
  • Does this answer your question? [Check if a VPN connection is active in Android?](https://stackoverflow.com/q/28386553/208273) – Ryan M Feb 18 '22 at 23:39

2 Answers2

1

caps is null, what else we can insight... just make some preventing if(caps!=null)... below some shorten way for checking null state

NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(activeNetwork);
boolean vpnInUse = caps!=null && caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
snachmsm
  • 17,866
  • 3
  • 32
  • 74
0

Looks like you are getting null reference of NetworkCapabilities. Please look into the developer.android docs.

This document says

This will return null if the network is unknown or if the |network| argument is null. This will remove any location sensitive data in TransportInfo embedded in NetworkCapabilities#getTransportInfo(). Some transport info instances like WifiInfo contain location sensitive information. Retrieving this location sensitive information (subject to app's location permissions) will be noted by system. To include any location sensitive data in TransportInfo, use a NetworkCallback with NetworkCallback#FLAG_INCLUDE_LOCATION_INFO flag.

hman_codes
  • 794
  • 9
  • 24