【问题标题】:Android VpnService - How to check VpnService if it was started?Android VpnService - 如何检查 VpnService 是否已启动?
【发布时间】:2014-03-30 05:34:28
【问题描述】:

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

有没有 api 可以做到这一点?

【问题讨论】:

标签: android vpn


【解决方案1】:

据我所知,您无法直接检查。以下是我在应用程序中用于检查 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");}

【讨论】:

    【解决方案2】:

    虽然上述方法有效,但它或多或少是一种 hack,需要发送 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;
    }
    

    【讨论】:

    • 我比 http hack 更喜欢这种方法,但我可以判断活动的 VPN 是否是 my VPN?喜欢以某种方式获取活动的 VPN 包名称?
    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 2016-12-01
    • 2017-12-05
    • 1970-01-01
    • 2016-09-13
    • 2021-11-09
    • 1970-01-01
    • 2013-12-12
    相关资源
    最近更新 更多