繁体   English   中英

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

[英]How to check VPN connection status on Android ICS

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

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

您如何获取当前适用于 Android 的 DNS 服务器?

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

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

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

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

对于 VPN 网络接口

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 发送消息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM