检查实际的互联网连接

时间:2014-01-13 23:10:42

标签: android

我在应用程序中有以下代码,用于检查互联网连接。它确实有效,即如果没有互联网就会说没有互联网(不像使用,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();
    }
}

1 个答案:

答案 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结合使用,应该可以让您清楚地了解网络状态和服务器的可访问性。