Android如何检查是否连接了WiFi但无法上网?

8
我正在编写一个程序,需要检查三个状态:1. 如果我没有WiFi,2. 如果我有WiFi但没有互联网连接(例如,如果我打开了路由器但拔掉了以太网电缆),以及3. 如果我有WiFi和互联网连接。然后,我将更改我的应用程序中图标的颜色来表示这些状态之一(红色,黄色或绿色)。目前条件2不起作用,每当我在测试时拔掉路由器上的电缆时,图标颜色就会从绿色变为红色。
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个回答

18

像这样检查wifi是否可用

函数1

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

    return wifi.isConnected();
}

在此之后,可以像这样检查互联网是否可用:

函数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;
}

条件

  1. 如果函数1返回false --> 将颜色更改为红色
  2. 如果函数1返回true并且函数2返回false --> 将颜色更改为黄色
  3. 如果两个函数都返回true --> 将颜色更改为绿色

我猜你的意思是:“如果函数1返回true且函数2返回false --> 将颜色更改为黄色”。非常感谢!我会检查一下这是否有效。 - Ben Akin
哦,是的!我错过了黄色部分。 :D - Rohit5k2
在调用谷歌页面时,白屏会出现几毫秒。如何解决? - Ajay
函数2会在Asynktask中还是直接在类中使用? - venkat
@venkat 在 AsyncTask 中肯定是专家。 - Mohamed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接