确定公共WiFi是否具有网络连接

时间:2015-06-17 18:18:46

标签: android networking wifimanager

是否可以确定用户已连接到的公共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

我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:1)

我知道您已经尝试ping服务器并将响应代码设置为200,这是一个好的情况但是当您将响应设置为200时,可能取决于各种因素。

Referencehttp://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

现在,我认为如果将data packets发送回服务器,并且如果确实在响应中获取了数据包,则表示连接成功。

但是,您可能希望等待服务器响应或设置一些connectionread 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协议仅响应 连接请求。