是否可以确定用户已连接到的公共WiFi
网络是否具有有效连接?
例如:你走进一个星巴克,你可以在那里连接到他们的免费WiFi
。需要注意的是,您需要接受他们的条款和条件。使用它的条件。
换句话说,有没有办法确定即使设备连接到星巴克WiFi
,他/她是否真的可以使用internet
?我查了一堆不同的SO帖子:
How to check internet is available in wifi(Though Wifi is connected )
how to check that internet on local wifi is available or not?
它们都不起作用。显然,尽管已连接到上述WiFi
网络,但回复中收到的http status code
对我来说仍为200
。
我在这里错过了什么吗?
答案 0 :(得分:1)
我知道您已经尝试ping服务器并将响应代码设置为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;
}
在上面的代码中,我将谷歌服务器作为检查的媒介。但是,您也可以像这样使用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#waitFor%28%29
试一试,如果这有帮助,我会很高兴。如果有更好的答案,我很高兴接受它..谢谢.. :)
答案 1 :(得分:0)
如果有条款和条件......那么在被接受之前你将无法判断。如果没有先决条件......那么自动连接和ping一个已知的外部服务器就可以得到一个很好的指示。
答案 2 :(得分:0)
网络可能使用透明代理连接。如果是这种情况,则没有与因特网的直接连接,即没有数据包简单地来回传递。
TP拦截HTTP请求,并代表您在真实网络上进行。这就是为什么他们可以插入请求用户登录或类似操作的屏幕,用户通过他/她的网络导航器进行操作。
TP可能会配置为使用HTTP和HTTPs协议仅响应 连接请求。