如何在Android ICS上检查VPN连接状态

时间:2012-06-01 13:11:25

标签: android broadcastreceiver vpn

我正在尝试注册接收器,这将检查VPN状态。我试过这个:Get VPN Connection status on Android但看起来它不再适用于ICS。我已经检查了android源代码的一些线索,但没有运气,只注意到在ISC中没有像:vpn.connectivityconnection_state - 它用于在android 2.3中。还尝试使用android.net.conn.CONNECTIVITY_CHANGE作为我的IntentFilter,但它根本没有对VPN连接做出反应(当然我添加了权限android.permission.ACCESS_NETWORK_STATE)。 我认为做起来很简单,但我已经没想到怎么做了......有人可以帮我这个吗?

4 个答案:

答案 0 :(得分:2)

可能您可以尝试轮询DNS服务器更改。如果它已更改,则VPN已连接。但是,我认为这条规则可能有很多例外。

How do you get the current DNS servers for Android?

答案 1 :(得分:0)

我的解决方案是查询NIC列表  #您可以通过执行命令“ls / sys / class / net”来获取列表
如果列表具有“tun0”,则设备已连接到VPN。

答案 2 :(得分:0)

NetworkCapabilities在API 21+中为我工作。不幸的是,我还没有找到19-20的解决方案。您必须遍历所有现有网络并检查哪个网络有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));

}

答案 3 :(得分:0)

for (Enumeration<NetworkInterface> en =
             NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
            NetworkInterface intf = en.nextElement();
            if (intf.getName().contains("tun0") || intf.getName().contains("ppp0")) {
                vpnInterface = intf;
                break;
            }
        }

对于VPNNetwork接口

for (Enumeration<InetAddress> en =
                 vpnInterface.getInetAddresses(); en.hasMoreElements(); ) {
                InetAddress address = en.nextElement();
                if (!address.isLoopbackAddress()) {
                    String ip = address.getHostAddress();
                    break;
                }
            }

和InetAddress

这就是我现在所知道的一切

检查它是否已启动等可能

if (vpnInterface.isUp())

我确实实现了一个代码,该代码在几个时间后调用自身并向ApplicationHandlers发送消息