Подтвердить что ты не робот

Как проверить состояние подключения 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). Я думал, что это просто, но у меня уже есть идеи, как это сделать... Мог ли кто-нибудь помочь мне в этом, пожалуйста?

4b9b3361

Ответ 1

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

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

Ответ 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