How to check VPN connection status on Android ICS

最后都变了- 提交于 2019-12-03 12:29:52

问题


I'm trying to register receiver, that will check VPN status. I have tried this: Get VPN Connection status on Android but looks like it no longer works on ICS. I have checked android source code for some clue, but with no luck, only noticed that in ISC there is nothing like: vpn.connectivity and connection_state - it use to be in android 2.3. Also tried using android.net.conn.CONNECTIVITY_CHANGE as my IntentFilter, but it doesn't react on VPN connection at all (of course I have added permission android.permission.ACCESS_NETWORK_STATE). I thought that it is simple thing to do, but I already run out of ideas how to do it... Could someone help me with this please?


回答1:


May be you can try to poll for DNS server changes. If it has changed then VPN has connected. However, I think there could be a lot of exception to this rule.

How do you get the current DNS servers for Android?




回答2:


My solution is polling a NIC list.
# You can get the list by executing command "ls /sys/class/net".

If the list has "tun0", the device already has connected to VPN.




回答3:


NetworkCapabilities worked for me in API 21+. Unfortunately I haven't found a solution for 19-20. You have to loop over all existing networks and check which has 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));

}



回答4:


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 the VPNNetwork Interface

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

and the InetAddress

Thats everything I know by the moment now

To check if it's up etc. maybe

if (vpnInterface.isUp())

I do have implemented a code which calls itself after a serveral time and send a message to the ApplicationHandlers



来源:https://stackoverflow.com/questions/10850966/how-to-check-vpn-connection-status-on-android-ics

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!