Android VpnService - 如果VpnService已启动,如何检查?

时间:2014-02-27 01:52:54

标签: android vpn

我有两个使用VpnService类的应用程序。但是,同时只能运行一个VPN连接。创建新接口时,现有接口将被停用,并且我希望新应用程序不启动vpnservice以避免旧应用程序停用及其VPN连接。所以我想在调用startService()之前检查是否启动了另一个vpnservice。

有没有api这样做?

2 个答案:

答案 0 :(得分:4)

据我所知你无法直接查看。以下是我在申请中用于检查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");}

答案 1 :(得分:0)

虽然上述方法可行,但它或多或少是一种黑客行为,需要发送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;
}