Skip to content Skip to sidebar Skip to footer

Detecting Limited Network Connectivity In Android?

There are a number of questions regarding how to detect network connectivity in Android. https://stackoverflow.com/a/4239019/90236 provides a very detailed answer and https://stack

Solution 1:

Is there a good way to determine that the user has a fully functioning network connection?

Try downloading something from somewhere. Ideally, the "somewhere" is your own server, to test connectivity between the device and your server.

Alas, there are no doesTehConnexionSuck() or iCanHazBandwidth() methods on ConnectivityManager. :-)

Is this overkill?

In the spirit of "Goldilocks and the Three Bears", I'd describe that as justrightkill.

We have to do the same sorts of shenanigans in Web apps too.

Solution 2:

For completeness, let me post some code that I've added. I think it is fairly generic HttpClient code to make an Http request and return true when the request is succesful. I used HttpHead because I don't care about the entity in the response and this should make it faster. This method is in a class called ConnectivityHelper and DefaultSettings is a class that has a bunch of useful constants defined.

publicstaticboolean isNetworkAvailable() {
    ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo;

    try {
        netInfo = manager.getActiveNetworkInfo();
    } catch (Exception e) {
        netInfo = null;
    }

    return netInfo != null && netInfo.isConnected() && testConnection(DefaultSettings.TEST_CONNECTION_URL);
}


privatestaticboolean testConnection(String url) {
    HttpClient httpClient = null;
    HttpHead request = null;
    HttpResponse response = null;
    int statusCode = 0;

    try {
        HttpParams myParams = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(myParams, DefaultSettings.CONNECTION_TIMEOUT);
        HttpConnectionParams.setSoTimeout(myParams, DefaultSettings.SO_TIMEOUT);

        httpClient = new DefaultHttpClient(myParams);

        request = new HttpHead(url);
        response = httpClient.execute(request);
        statusCode = response.getStatusLine().getStatusCode();

        if (statusCode != 200)
        {
            Log.e(ConnectivityHelper.class.getName(), String.format("testConnection not successful. For %s - Status code = %d", url, statusCode));
            returnfalse;
        }
        returntrue;

    } catch(ClientProtocolException e) {
        Log.e(ConnectivityHelper.class.getName(), String.format("testConnection failure. For %s - Exception: %s.", url, e.toString()));

        if (request != null && !request.isAborted()) {
            request.abort();
        }

        returnfalse;
    } catch(IOException e) {
        if (statusCode == 401) {
            Log.e(ConnectivityHelper.class.getName(), String.format("testConnection access denied. For %s - Status code = %d", url, statusCode));               
        } else {
            Log.e(ConnectivityHelper.class.getName(), String.format("testConnection failure. For %s - Exception: %s.", url, e.toString()));
        }

        if (request != null && !request.isAborted()) {
            request.abort();
        }

        returnfalse;
    } finally {
        if (httpClient != null) {
            httpClient.getConnectionManager().shutdown();
        }
    }           
}

Post a Comment for "Detecting Limited Network Connectivity In Android?"