Prüfen, ob eine VPN-Verbindung in Android aktiv ist?

Lesezeit: 5 Minuten

Ich habe eine VPN-App eines Drittanbieters auf meinem nicht gerooteten Android 4.4-Gerät und möchte einen Hintergrunddienst schreiben, um die VPN-Verbindung zu überwachen und den Benutzer zu warnen, wenn die VPN-Verbindung unterbrochen wurde.

Gibt es eine Möglichkeit, dies zu tun? Ich konnte keine Möglichkeit finden, die VPNService-API zu verwenden.

Danke: D

Verwenden NetworkCapabilities hat bei mir funktioniert. Sie müssen alle vorhandenen Netzwerke durchschleifen und prüfen, welches hat 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));

}

  • ConnectivityManager.getAllNetworks() ist nur in verfügbar API-Level 21 Lollipop. @Isaac Madwed Hast du jetzt eine Möglichkeit, dies zu überprüfen? API Level 15 Eiscreme-Sandwich und darüber ?

    – vovahost

    26. Februar 2016 um 8:44 Uhr


  • Leider nicht @vovahost. Mein Team hat Interesse daran, diese Android-Versionen ebenfalls zu unterstützen, daher werde ich meinen Beitrag bearbeiten, wenn wir etwas herausfinden.

    – Isaac Madwed

    29. Februar 2016 um 14:50 Uhr

  • Woher weißt du, welcher aktiv ist?

    – NickF

    3. April 2016 um 15:46 Uhr

  • @ NickF Sie können verwenden getActiveNetwork() auf API 23+. Bei API 21 und 22 betrachte ich ein VPN als verbunden, wenn ein Netzwerk über ein VPN verfügt.

    – Ludwig CAD

    29. August 2017 um 14:52 Uhr

Prufen ob eine VPN Verbindung in Android aktiv ist
UndZp

Das funktioniert bei mir: Getestet von API 16 bis 23:

List<String> networkList = new ArrayList<>();
try {
    for (NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces())) {
        if (networkInterface.isUp())
            networkList.add(networkInterface.getName());
    }
} catch (Exception ex) {
    Timber.d("isVpnUsing Network List didn't received");
}

return networkList.contains("tun0");

PS: Es kann auch eine andere Netzwerkschnittstelle mit dem Namen “ppp0” sein, aber in meinen Tests mit verschiedenen VPN-Apps war es immer “tun0”.

  • Dies ändert sich. Wenn Sie beispielsweise OpenVPN verwenden, heißt es tunX, wobei X manchmal eine inkrementierte ID ist. Bei Verwendung von PPTP ist die verwendete Schnittstelle pptpXwobei X wiederum eine ID ist, die bei 0 beginnt.

    – TheRealChx101

    22. Dezember 2016 um 12:19 Uhr


1647109986 873 Prufen ob eine VPN Verbindung in Android aktiv ist
Pedro Lobito

Späte Antwort, auf Android getestet 16 <-> 29:

public boolean vpn() {
    String iface = "";
    try {
        for (NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces())) {
            if (networkInterface.isUp())
                iface = networkInterface.getName();
                Log.d("DEBUG", "IFACE NAME: " + iface);
            if ( iface.contains("tun") || iface.contains("ppp") || iface.contains("pptp")) {
                return true;
            }
        }
    } catch (SocketException e1) {
        e1.printStackTrace();
    }

    return false;
}

Das Obige funktioniert nicht mit Wireguard, da der Schnittstellenname beliebig sein kann (normalerweise der Name der Verbindung).

Eine Alternative, um zu überprüfen, ob das aktive Netzwerk VPN verwendet:

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

1647109986 683 Prufen ob eine VPN Verbindung in Android aktiv ist
Stuart Siegler

Schreiben Sie eine kleine App, die auf eine interne Seite zugreift oder eine interne Site anpingt …

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(internal_url);
HttpResponse response = client.execute(request);

String html = "";
InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null)
{
    str.append(line);
}
in.close();
html = str.toString();

oder

String str = "";
try 
{
    Process process = Runtime.getRuntime().exec(
            "/system/bin/ping -c 8 " + internal_url);
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            process.getInputStream()));
    int i;
    char[] buffer = new char[4096];
    StringBuffer output = new StringBuffer();
    while ((i = reader.read(buffer)) > 0)
        output.append(buffer, 0, i);
    reader.close();


    str = output.toString();

} 
catch (IOException e)
{

    e.printStackTrace();
}
return str;

  • Danke Stuart. Das wird funktionieren, aber ich suche nach etwas, das kein Ping eines Back-End-Dienstes erfordert. Gibt es systemweite Broadcasts, die Android basierend auf dem VPN-Status sendet?

    – Dan Largo

    7. Februar 2015 um 20:04 Uhr

  • @ user714122 der vpnService-Vorbereitung () (developer.android.com/reference/android/net/VpnService.html) könnte hier verwendet werden, aber das dient eher zum Herstellen einer VPN-Verbindung

    – Stuart Siegler

    7. Februar 2015 um 20:37 Uhr


Prufen ob eine VPN Verbindung in Android aktiv ist
chksr

Wie wäre es, wenn Sie die Netzwerkinformationen überprüfen? Wenn man eine Art VPN hat, würde ich davon ausgehen, dass es eine VPN-Verbindung gibt.

Erfordert die Berechtigung ACCESS_NETWORK_STATE.

            List<NetworkInfo> connectedNetworks    = new ArrayList<>();

        if (Build.VERSION.SDK_INT >= 21)
            {
            Network[] networks = m_ConnectivityManager.getAllNetworks();

            for (Network n : networks)
                {
                NetworkInfo ni = m_ConnectivityManager.getNetworkInfo(n);

                if (ni.isConnectedOrConnecting())
                    {
                    connectedNetworks.add(ni);
                    }
                }
            }
        else
            {
            NetworkInfo[] nis = m_ConnectivityManager.getAllNetworkInfo();

            for (NetworkInfo ni : nis)
                {
                if (ni.isConnectedOrConnecting())
                    {
                    connectedNetworks.add(ni);
                    }
                }
            }

        boolean bHasVPN = false;

        if (Build.VERSION.SDK_INT >= 21)
            {
            for (NetworkInfo ni : connectedNetworks)
                {
                bHasVPN |= (ni.getType() == ConnectivityManager.TYPE_VPN);
                }
            }

  • Danke Stuart. Das wird funktionieren, aber ich suche nach etwas, das kein Ping eines Back-End-Dienstes erfordert. Gibt es systemweite Broadcasts, die Android basierend auf dem VPN-Status sendet?

    – Dan Largo

    7. Februar 2015 um 20:04 Uhr

  • @ user714122 der vpnService-Vorbereitung () (developer.android.com/reference/android/net/VpnService.html) könnte hier verwendet werden, aber das dient eher zum Herstellen einer VPN-Verbindung

    – Stuart Siegler

    7. Februar 2015 um 20:37 Uhr


1646391789 964 Wie andere ich die Farben eines Drawable in Android
touhid udoy

Ich habe eine Hilfsfunktion für mich selbst geschrieben, die API 21 und höher funktioniert.

public static boolean vpnActive(Context context){

        //this method doesn't work below API 21
        if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
            return false;

        boolean vpnInUse = false;

        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);


        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {

            Network activeNetwork = connectivityManager.getActiveNetwork();
            NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(activeNetwork);

            return caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
        }

        Network[] networks = connectivityManager.getAllNetworks();

        for(int i = 0; i < networks.length; i++) {

            NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(networks[i]);
        if(caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
            vpnInUse = true;
            break;
        }
    }

    return vpnInUse;
}

994860cookie-checkPrüfen, ob eine VPN-Verbindung in Android aktiv ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy