我正在开发一个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也可以访问?我只能访问我的移动服务提供商的网页,我可以在那里购买更多的免税额,这样互联网就不会被关闭,只会受到限制。我该如何检查?
答案 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.4
,www.cnn.com
,www.yahoo.com
等。
这将是一个很好的方式来做一个理智的'校验。 (确保在后台线程中执行此操作,以防设备未连接到互联网。此外,我混合/匹配1个IP和1个域名,这样您就可以告诉用户'为什么& #39;您的应用无法连接。
但您可能只应在尝试连接到服务器失败后执行此操作。 (正如通过健全性检查判断您的网站是否已关闭)
然后,如果您能够对这些网站执行ping操作,请尝试完整的HTTP连接,并验证该页面是否正确。你得到的是正确的'。不只是HTTP响应代码。因为您的ISP可能用于重定向您的网络流量的HTTP MITM(中间的人)将返回200,因为它是有效的'页面...但不是'所需的'页。
您可以通过在服务器上创建一个只有HTML标题' HTTP CHECK'并且' GOOD'或者类似于身体的东西。然后验证您的应用是否获得该页面(实际检查HTML内容)而不是“其他内容”#39; (例如Paywall)。