13

So far:

I found the following solutions

  1. Using Broadcastreceiver

    The broadcast receiver is deprecated from ICS

  2. Using Ping or Traceroute

    It's definitely going to take lots of time and its not efficient

  3. Polling for DNS server changes

    It's definitely going to take lots of time and its not efficient

  4. Using ip-address

    Even though it won't take much time depending on the network connection it may vary

My conclusion:

So far all the solutions I found are either not efficient or not so reliable.

My questions:

If VPN is connected in android device then android OS must be aware of it.

Are there any public android framework APIs to read it because finding it locally is most efficient and reliable solution ?

Are there any other efficient and reliable ways to achieve it (like integrating a C or C plus plus library with NDK)?

Note:

I couldn't find any custom broadcast senders/AIDL from OpenVPN for Android as well

Paul Roub
  • 36,322
  • 27
  • 84
  • 93
Durai Amuthan.H
  • 31,670
  • 10
  • 160
  • 241
  • 1
    Several questions: What is the underlying problem which you are trying to solve? Why do you need to know whether you are on VPN or not? Are you implementing your own VPN or do you want to check status of VPN in some other type of application? – Victor Ronin Jul 21 '14 at 16:52

3 Answers3

9

You can try to check for tun0 INTERFACE, It is being start afther the establish command.

try {
    for( NetworkInterface intf : Collections.list(NetworkInterface.getNetworkInterfaces())) {

        // Pass over dormant interfaces
        if(!intf.isUp() || intf.getInterfaceAddresses().size() == 0)
            continue;

            if ("tun0".equals(intf.getName())){
                // The VPN is up
                break;
            }
    }
}

this also might work:

(Collections.list(NetworkInterface.getByName("tun0")

Ilan.b
  • 583
  • 6
  • 19
3

Have you used - VpnService

As per documentation -

Prepare to establish a VPN connection. This method returns 'null' if the VPN application 
is 'already prepared'.

From here-

http://developer.android.com/reference/android/net/VpnService.html#prepare(android.content.Context)

 Intent intent = VpnService.prepare(getApplicationContext());
  if (intent == null) {
    // this means there is already a prepared VPN connection
  }
Ninad Pingale
  • 6,801
  • 5
  • 32
  • 55
  • 1
    As per the documentation Prepare is meant to be having a single VPN connection so If a vpn connection is already there then it will return nul if not then it will return a respective object But it always returns null even if there is not vpn connection at all. – Durai Amuthan.H Jul 21 '14 at 13:30
  • 1
    Even though the solution didn't work out,its actually a good try – Durai Amuthan.H Jul 22 '14 at 14:49
0

I know the answer is ridiculously late, but I was just trying to figure this out and stumbled upon the command:

ifconfig tun0

This will return an IP address and other info if the VPN is connected and if it isn't.

tun0: No such device

Gustavo Morales
  • 2,614
  • 9
  • 29
  • 37
ribzer
  • 1