При холодном запуске приложения Android предотвращение сетевых запросов до запуска VPN - PullRequest
0 голосов
/ 06 февраля 2020

В нашем приложении есть много различных модулей, которые могут самостоятельно выполнять сетевые запросы. Приложение имеет возможность использовать VPN для безопасного соединения. VPN-сервис обрабатывает только сеть для нашего приложения. Моя проблема: при холодном запуске приложения, когда включена функция VPN, как запретить модулям отправлять сетевые запросы до запуска службы VPN.

1 Ответ

1 голос
/ 06 февраля 2020

У меня была похожая проблема в моем проекте, но у меня был один модуль, который должен был ждать установки VPN. Во всяком случае, у меня есть небольшой код, чтобы определить, подключен ли VPN или нет.

Вот код:

class VpnMonitor {
    private final String VPN_INTERFACE = "tun0";

    private OnVpnStatusChange mCallback;
    private MonitorThread mThread = null;
    private Handler mHandler = new Handler(Looper.getMainLooper());

    public interface OnVpnStatusChange {
        void onVpnConnect();

        void onVpnDisconnect();
    }

    VpnMonitor() {
        this(null);
    }

    VpnMonitor(@Nullable OnVpnStatusChange callback) {
        mCallback = callback;
    }

    void startMonitor() {
        if ((mThread == null) || !mThread.isAlive()) {
            mThread = new MonitorThread();
            mThread.start();
        }
    }

    void stopMonitor() {
        if (mThread != null) {
            mThread.terminate();
            try {
                mThread.join();
            } catch (Exception e) {
            }
            mThread = null;
        }
    }

    boolean isVpnConnectionUp() {
        try {
            ArrayList<NetworkInterface> infs = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface inf : infs) {
                if (inf.getName().equals(VPN_INTERFACE) && inf.isUp() && inf.getInterfaceAddresses().size() > 0) {
                    return true;
                }
            }
        } catch (SocketException e) {
            return false;
        }

        return false;
    }

    private class MonitorThread extends Thread {
        private volatile boolean mRunning = true;

        void terminate() {
            mRunning = false;
        }

        @Override
        public void run() {
            mRunning = true;

            for (int i = 0; i < 5; i++) {
                try {
                    delay(100);

                    ArrayList<NetworkInterface> infs = Collections.list(NetworkInterface.getNetworkInterfaces());

                    for (NetworkInterface inf : infs) {
                        if (inf.getName().equals(VPN_INTERFACE)) {
                            for (int r = 0; r < 10; r++) {
                                if (!mRunning) {
                                    mHandler.post(new Runnable() {
                                        @Override
                                        public void run() {
                                            if (mCallback != null) {
                                                mCallback.onVpnDisconnect();
                                            }
                                        }
                                    });

                                    return;
                                }

                                if (inf.isUp() && inf.getInterfaceAddresses().size() > 0) {
                                    delay(1000);

                                    mHandler.post(new Runnable() {
                                        @Override
                                        public void run() {
                                            if (mCallback != null) {
                                                mCallback.onVpnConnect();
                                            }
                                        }
                                    });

                                    return;
                                }

                                delay(50);
                            }
                        }
                    }
                } catch (SocketException e) {
                }
            }

            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    if (mCallback != null) {
                        mCallback.onVpnDisconnect();
                    }
                }
            });

        }

        private void delay(int time) {
            try {
                Thread.sleep(time);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}

Может быть, это может помочь вам тоже. Не стесняйтесь менять его, как вам угодно.

...