检查设备是否真的连接到互联网android

时间:2015-12-23 23:25:38

标签: android

我正在开发一个Android应用程序,我需要使用以下方法检查设备是否真的连接到互联网

cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            if (cm.getActiveNetworkInfo() != null
                    && cm.getActiveNetworkInfo().isAvailable()
                    && cm.getActiveNetworkInfo().isConnected()) {
                try {
                    URL url = new URL("http://www.google.com");
                    HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                    urlc.setRequestProperty("Connection", "close");
                    urlc.setConnectTimeout(10 * 1000); // Ten seconds timeout in milliseconds
                    urlc.connect();
                    if (urlc.getResponseCode() == 200) { // success
                        System.out.println("success mobile");
                        return true;
                    } else { // Fail
                        return false;
                    }
                } catch (IOException e) {
                    return false;
                }
            } 
            else 
            {
                return false;
            }

如果我禁用移动数据或wifi,此方法有效。但是,在我的情况下,提供商只是停止了互联网,因为我已经达到了我的使用限制或用完了数据限额。因此,在这种情况下,该方法返回TRUE,即使我去浏览器并输入google.com它不起作用,我收到提供商的消息,我已达到我的限制?因此,即使我无法通过使用限制从设备上打开它,google.com ping也可以访问?我只能访问我的移动服务提供商的网页,我可以在那里购买更多的免税额,这样互联网就不会被关闭,只会受到限制。我该如何检查?

2 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法是实现超时异常。

HttpGet httpGet = new HttpGet(url);
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used. 
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT) 
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpResponse response = httpClient.execute(httpGet);

答案 1 :(得分:0)

您可以Ping众所周知的公共网站,例如Google的公共DNS服务器:8.8.8.8 and 8.8.4.4www.cnn.comwww.yahoo.com等。

这将是一个很好的方式来做一个理智的'校验。 (确保在后台线程中执行此操作,以防设备未连接到互联网。此外,我混合/匹配1个IP和1个域名,这样您就可以告诉用户'为什么& #39;您的应用无法连接。

但您可能只应在尝试连接到服务器失败后执行此操作。 (正如通过健全性检查判断您的网站是否已关闭)

然后,如果您能够对这些网站执行ping操作,请尝试完整的HTTP连接,并验证该页面是否正确。你得到的是正确的'。不只是HTTP响应代码。因为您的ISP可能用于重定向您的网络流量的HTTP MITM(中间的人)将返回200,因为它是有效的'页面...但不是'所需的'页。

您可以通过在服务器上创建一个只有HTML标题' HTTP CHECK'并且' GOOD'或者类似于身体的东西。然后验证您的应用是否获得该页面(实际检查HTML内容)而不是“其他内容”#39; (例如Paywall)。