Я пытаюсь зарегистрировать приемник, который проверяет статус 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
).
Я думал, что это просто, но у меня уже есть идеи, как это сделать... Мог ли кто-нибудь помочь мне в этом, пожалуйста?
Как проверить состояние подключения VPN на Android ICS
Ответ 1
Может быть, вы можете попробовать опросить изменения DNS-сервера. Если он изменился, VPN подключился. Тем не менее, я думаю, что может быть много исключений из этого правила.
Ответ 2
Мое решение - опрос списка сетевых адаптеров.
# Вы можете получить список, выполнив команду "ls/sys/class/net".
Если в списке есть "tun0", устройство уже подключилось к VPN.
Ответ 3
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));
}
Ответ 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;
}
}
Для интерфейса 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