簡體   English   中英

Android VpnService - 如果VpnService已啟動,如何檢查?

[英]Android VpnService - How to check VpnService if it was started?

我有兩個使用VpnService類的應用程序。 但是,同時只能運行一個VPN連接。 創建新接口時,現有接口將被停用,並且我希望新應用程序不啟動vpnservice以避免舊應用程序停用及其VPN連接。 所以我想在調用startService()之前檢查是否啟動了另一個vpnservice。

這有什么api嗎?

據我所知你不能直接檢查。以下是我在我的應用程序中用於檢查VPN連接的方法。

1)為http://jsonip.com進行HTTPGet調用

                    public static String GetDeviceIp(){

                    HttpGet req = new HttpGet("http://jsonip.com");

                    DefaultHttpClient httpClient = new DefaultHttpClient();

                    HttpResponse response = httpClient.execute(req); 


                    if (response.getStatusLine().getStatusCode() == 200){
                        ipaddress=parseJson(response.getEntity().getContent());

                    }else
                    { ipaddress ="EMPTY" }

                    return ipaddress
          }

2)解析json響應並從響應中提取IP地址

      public static String parseJson(InputStream in)
      {
         String iP;
        try{

        String result;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8);
        StringBuilder sb = new StringBuilder();

        String line = null;
        while ((line = bufferedReader.readLine()) != null)
        {
            sb.append(line + "\n");
        }
        result = sb.toString(); 

        JSONObject jsonObject = new JSONObject(result);
        iP=jsonObject.getString("ip");
    }catch (Exception e){
        iP="EMPTY";
    }

    return iP;
   }

3)比較VPN服務器Ip和提取的Ip是否相等,如果是,則VPN開啟,否則VPN關閉

public static boolean IsVPNON(){
    return GetDeviceIp().equals("VPN-IP address");}

雖然上述方法有效,但它或多或少都是黑客攻擊,需要發送HTTP請求。

由於這似乎是在啟動另一個VPN之前要運行的一次性檢查,因此您可以檢查VPN網絡是否是所有可用網絡的一部分。

private boolean isAnyVpnConnected(Context context) {
    ConnectivityManager connectivityManager =
            (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
    Network[] networks = connectivityManager.getAllNetworks();
    if (networks == null) {
        return false;
    }
    for (Network network : networks) {
        NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
        if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) &&
                !capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)) {
            return true;
        }
    }
    return false;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM