Определите, есть ли у общественного 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.