我在应用程序中有以下代码,用于检查互联网连接。它确实有效,即如果没有互联网就会说没有互联网(不像使用,ConnectivityManager只会告诉你你是否连接到路由器/ 3g,但实际上没有检查互联网连接),但只是直到某人连接到将用户重定向到登录页面的wifi点。然后应用程序将返回200代码并尝试继续,但最终会崩溃(并且稍微崩溃)。我的应用程序主要用于有这样一个wifi点的位置。如何检查请求是否已重定向?
class online extends AsyncTask<String, String, String>
{
boolean responded = false;
@Override
protected void onPreExecute()
{
super.onPreExecute();
pDialog2 = new ProgressDialog(Main.this);
pDialog2.setMessage("Checking internet, please wait...");
pDialog2.setIndeterminate(false);
pDialog2.setCancelable(false);
pDialog2.show();
}
protected String doInBackground(String... args)
{
try
{
URL url = new URL("http://mydomain.com/connectionTest.html");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(6000); // Timeout is in seconds
urlc.setReadTimeout(6000);
urlc.connect();
if (urlc.getResponseCode() == 200)
{
responded = true;
} else
{
}
} catch (IOException e)
{
}
try
{
int waited = 0;
while (!responded && (waited < 5000))
{
mHandler.postDelayed(new Runnable()
{
public void run()
{
}
}, 100);
waited += 100;
}
}
finally
{
if (!responded)
{
h.sendEmptyMessage(0);
}
else
{
h.sendEmptyMessage(1);
}
}
return null;
}
protected void onPostExecute(String file_url)
{
pDialog2.dismiss();
}
}
答案 0 :(得分:4)
如果您可以控制要连接的网络服务,则可以使用与Google检查Wi-Fi重定向门户网站类似的技巧。
您偶尔会看到http://google.com/generate_204
的请求。如果您位于公共访问点密码页面后面,那么您通常会从服务器收到200 Ok
,该服务器拦截了Web请求以便为登录页面提供服务。如果用户已经登录,那么您将从服务中收到HTTP 204 No Content
状态。
要检查您是否可以访问公共网络,可以运行以下命令;
URL url = new URL("http://google.com/generate_204");
HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection();
httpUrlConnection.setConnectTimeout(6000); // Timeout is in seconds
httpUrlConnection.setReadTimeout(6000);
httpUrlConnection.connect();
if (httpUrlConnection.getResponseCode() == HttpURLConnection.HTTP_NO_CONTENT) {
// Great you have free access to the web
} else {
// Either your server is mis-configured or you are behind a hotspot login screen
}
理想情况下,您会在自己的网络服务器上托管自己的/generate_204
,然后您就不会被Google的无证更改所困扰。此外,它还可以作为从设备检查服务器可访问性的方法。
将此与ConnectivityManager
结合使用,应该可以让您清楚地了解网络状态和服务器的可访问性。