Определите, есть ли у общественного WiFi подключение к сети

Можно ли определить, является ли публика WiFi сеть, к которой подключен пользователь, имеет активное подключение?

Например: вы входите в Starbucks, где вы можете подключиться к их бесплатно WiFi, Предостережение заключается в том, что вы должны принять их условия и положения, чтобы использовать его.

Проще говоря, есть ли способ определить, что, хотя устройство подключено к Starbucks WiFiдействительно ли он / она может использовать internet? Я посмотрел кучу разных SO сообщений:

Как проверить интернет доступен в Wi-Fi (хотя Wi-Fi подключен)

как проверить что интернет на локальном wifi доступен или нет?

Никто из них не работает. Видимо, несмотря на подключение к вышеупомянутому WiFi сеть, http status code получил в ответе еще 200 для меня.

Я что-то здесь упускаю?

3 ответа

Я знаю, что вы пытались пропинговать сервер и получили код ответа 200, что для нормальной ситуации, но когда вы получите ответ 200, это может зависеть от различных факторов.

Reference: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Теперь я верю, что если data packets отправляются обратно на сервер, и если вы получаете пакеты в ответе, соединение успешно установлено.

Тем не менее, вы можете дождаться ответа сервера или установить некоторые connection или же read timeout чтобы убедиться, что нет плохого ответа.

Это пример кода, который я использовал в прошлом для определения интернет-соединения. Я использую Process определить чек и попытался получить возвращаемое значение как 0,

public Boolean isConnectionAvailable() {
        try {
            Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
            int returnVal = process.waitFor();
            boolean reachable = (returnVal == 0);
            if (reachable) {

                Log.i(TAG, "Connection Successful");
                return reachable;
            } else {

                Log.e(TAG, "No Internet access");
            }

        } catch (Exception e) {

            e.printStackTrace();
        } finally {
            process.destroy();
        }
        return false;
    }

В приведенном выше коде у меня есть сервер Google в качестве средства для проверки. Тем не менее, вы можете использовать 8.8.8.8 так:

Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 8.8.8.8");

Когда процесс выполняется, он даст возвращаемое значение, которое определит сбой и успешность соединения.

Ключевым элементом является использование waitFor() метод из класса Java Process.class тот causes the calling thread to wait for the native process associated with this object to finish executing.,

Ссылка: http://developer.android.com/reference/java/lang/Process.html

Дайте ему шанс, и я буду рад, если это поможет. Если есть лучший ответ, я рад принять его.. Спасибо..:)

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

Сеть, вероятно, подключена с использованием прозрачного прокси. В этом случае прямой связи с Интернетом нет, т. Е. Пакеты просто не передаются туда-сюда.

TP перехватывает HTTP-запросы и делает их от вашего имени в реальной сети. Вот почему они могут вставить экран, запрашивающий логин пользователя или подобное действие, которое пользователь получает через свой веб-навигатор.

ТР, вероятно, будет настроен для ответа только на запросы соединения с использованием протоколов HTTP и HTTP.

Другие вопросы по тегам