Android Check if there is WiFi but no internet

2019-02-01 02:19发布

问题:

I am writing a program where I need to check three states: 1. If I have no WiFi, 2. if I have WiFi but no internet connection (like if I turn on my router but unplug the Ethernet cable), and 3. if I have WiFi and internet connection. I would then change color of a icon in my app to represent one of these states (red, yellow, or green). Currently condition 2 does not work, anytime I unplug the cable on my router for testing, the icon color changes from green to red.

public static void doPing(Context context) {

        String googleUrl = "https://www.google.com";
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        try {
            HttpParams httpParameters = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParameters, TIMEOUT_CONNECTION);

            HttpConnectionParams.setSoTimeout(httpParameters, TIMEOUT_SOCKET);

            HttpClient client = new DefaultHttpClient(httpParameters);
            if (L) Log.i(TAG, "Calling: " + url );
            HttpGet getGoogle = getHttpGet(googleUrl);
            HttpResponse responseGoogle = client.execute(getGoogle);

            if (responseGoogle != null){
                 connectionIconView.setIcon(R.drawable.green_wifi);
            }
            else if (cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null){
                connectionIconView.setIcon(R.drawable.yellow_wifi);
            }
            else {
                 connectionIconView.setIcon(R.drawable.red_wifi);
            }

        } catch(Exception e) {
            if (L) Log.e(TAG, "Error during HTTP call");
            e.printStackTrace();
        }

回答1:

Check if wifi is available like this

function 1

private boolean isWifiAvailable() {
    ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    return wifi.isConnected();
}

After this, check like this if internet is available

function 2

 public static boolean isInternetAccessible(Context context) {
 if (isWifiAvailable()) {
    try {
        HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
        urlc.setRequestProperty("User-Agent", "Test");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(1500); 
        urlc.connect();
        return (urlc.getResponseCode() == 200);
    } catch (IOException e) {
        Log.e(LOG_TAG, "Couldn't check internet connection", e);
    }
} else {
    Log.d(LOG_TAG, "Internet not available!");
}
return false;
}

Conditions

  1. If function 1 returns false --> change color to RED
  2. If function 1 return true and function 2 returns false --> change color to YELLOW
  3. If both functions return true --> change color to GREEN