我有两个使用VpnService类的应用程序。但是,同时只能运行一个VPN连接。创建新接口时,现有接口将被停用,并且我希望新应用程序不启动vpnservice以避免旧应用程序停用及其VPN连接。所以我想在调用startService()之前检查是否启动了另一个vpnservice。
有没有api这样做?
答案 0 :(得分:4)
据我所知你无法直接查看。以下是我在申请中用于检查VPN连接的方法。
进行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;
}