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

如何在Android ICS上检查VPN连接状态,android,broadcastreceiver,vpn,Android,Broadcastreceiver,Vpn,我正在尝试注册接收器,这将检查VPN状态。我已经试过了:但看起来它在ICS上不再有效。我已经检查了android源代码以获得一些线索,但运气不好,只注意到在ISC中没有类似的东西:vpn.connectivity和connection\u state——它以前在android 2.3中。还尝试使用android.net.conn.CONNECTIVITY\u CHANGE作为我的IntentFilter,但它对VPN连接根本没有反应(当然,我添加了权限android.permission.ACC

我正在尝试注册接收器,这将检查VPN状态。我已经试过了:但看起来它在ICS上不再有效。我已经检查了android源代码以获得一些线索,但运气不好,只注意到在ISC中没有类似的东西:
vpn.connectivity
connection\u state
——它以前在android 2.3中。还尝试使用
android.net.conn.CONNECTIVITY\u CHANGE
作为我的
IntentFilter
,但它对VPN连接根本没有反应(当然,我添加了权限
android.permission.ACCESS\u NETWORK\u STATE
)。
我认为这是一件简单的事情,但我已经没有办法去做了。。。有人能帮我吗?

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


我的解决方案是轮询NIC列表。
#您可以通过执行命令“ls/sys/class/net”来获取列表。

如果列表中有“tun0”,则表示设备已连接到VPN


网络功能在API 21+中对我起作用。不幸的是,我还没有找到19-20的解决方案。您必须在所有现有网络上循环,并检查哪个网络具有
VPN\u传输

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));

}
ConnectivityManager cm=(ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_服务);
Network[]networks=cm.getAllNetworks();
Log.i(标记“网络计数:”+网络长度);
对于(int i=0;i
我确实实现了一个代码,它在服务器时间后调用自身并向ApplicationHandler发送消息

for (Enumeration<NetworkInterface> en =
             NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
            NetworkInterface intf = en.nextElement();
            if (intf.getName().contains("tun0") || intf.getName().contains("ppp0")) {
                vpnInterface = intf;
                break;
            }
        }
for (Enumeration<InetAddress> en =
                 vpnInterface.getInetAddresses(); en.hasMoreElements(); ) {
                InetAddress address = en.nextElement();
                if (!address.isLoopbackAddress()) {
                    String ip = address.getHostAddress();
                    break;
                }
            }
if (vpnInterface.isUp())