Как проверить состояние подключения VPN на Android ICS

Я пытаюсь зарегистрировать приемник, который проверяет статус VPN. Я пробовал это: Получить статус VPN-подключения на Android, но похоже, что он больше не работает на ICS. Я проверил исходный код Android для некоторой подсказки, но не повезло, заметил только, что в ISC нет ничего похожего: vpn.connectivity и connection_state – он используется для android 2.3. Также попытался использовать android.net.conn.CONNECTIVITY_CHANGE как мой IntentFilter , но он вообще не реагирует на VPN-соединение (конечно, я добавил разрешение android.permission.ACCESS_NETWORK_STATE ). Я думал, что это просто, но у меня уже есть идеи, как это сделать … Мог ли кто-нибудь помочь мне в этом, пожалуйста?

Может быть, вы можете попробовать опросить изменения DNS-сервера. Если он изменился, подключился VPN. Однако, я думаю, что может быть много исключений из этого правила.

Как вы получаете текущие DNS-серверы для Android?

Мое решение – опрос списка сетевых адаптеров.
# Вы можете получить список, выполнив команду «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; } } 

Для интерфейса 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