如何检查WiFi网络是否可用(即使已连接)?

4
我使用了以下代码来检查互联网是否可用...
    ConnectivityManager connectivity = (ConnectivityManager) _context
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    if (connectivity != null) {

        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null)
            for (int i = 0; i < info.length; i++)

    if (info[i].getState() == NetworkInfo.State.CONNECTED && info[i].isAvailable())

        {
            return true;
        }
    }
    return false;

但我想要的是:

假设wifi已连接,但wifi中没有互联网...如何检查在wifi中是否可用互联网数据,即使wifi已连接..如果我使用上述代码,它只会检查wifi是否已连接或断开连接..如果有人能给我一个解决方案,我将不胜感激..


顺便说一下,你可以很容易地通过使用谷歌找到这个答案。此外,在stackoverflow上也有许多类似的问题。 - VendettaDroid
6个回答

3

最简单的方法是发送HTTP请求,如果你的HTTP请求超时,则说明你没有互联网连接,或者你可以检查更多的响应代码。当您连接到WiFi但WiFi路由器没有与ISP建立活动连接时,会发生您提到的情况。在我看来,最好的方法是依赖于HTTP请求。

以下是示例代码:

try
  {

   HttpGet request = new HttpGet(url));
   HttpParams httpParameters = new BasicHttpParams();
   // Set the timeout in milliseconds until a connection is established.
   // The default value is zero, that means the timeout is not used. 
   int timeoutConnection = 60000;
   HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
   // Set the default socket timeout (SO_TIMEOUT) 
   // in milliseconds which is the timeout for waiting for data.
   int timeoutSocket = 60000;
   HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
   // create object of DefaultHttpClient    
   DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
   request.addHeader("Content-Type", "application/json");
   HttpResponse response = httpClient.execute(request);
   // get response entity
   HttpEntity entity = response.getEntity();
   // convert entity response to string

     if (entity != null)
      {
         result = EntityUtils.toString(entity);
      }

   }
 catch (SocketException e)
  {
     return "-222" + e.toString();
  }
 catch (Exception e)
  {
     return "-333" + e.toString();
  }

如果您找到了答案,请直接接受它,这将提高您的接受率。 - VendettaDroid

1

是的,VendettaDroid是正确的。

此外,这里有代码可以检查WIFI互联网并检查飞行模式是否开启/关闭,如果您正在制作Web应用程序,则必须处理飞行模式。

// Check Flight mode ON/OFF
    if (Settings.System.getInt(context.getContentResolver(),
            Settings.System.AIRPLANE_MODE_ON, 0) == 0) {

// Flight mode ON not able to access internet
}

检查WiFi和互联网的可用性

ConnectivityManager cm;
cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm.getActiveNetworkInfo() != null
                && cm.getActiveNetworkInfo().isAvailable()
                && cm.getActiveNetworkInfo().isConnected()) {

 // Internet is availble.
}

1

我刚刚为最新的"Mobile Free"应用在Play Store上工作了一下https://play.google.com/store/apps/details?id=com.mobilefree

NetworkInfo.isAvailable()告诉你是否有可连接的物理网络。 NetworkInfo.isConnected()告诉你是否已连接到物理网络。

物理网络可以是WIFI、MOBILE、ETHER等传输层。

仅仅因为你连接到一个网络并不意味着该网络具有互联网(应用层)。

网络可以有各种应用协议,TCP、DNS和HTTP并不是唯一的协议。

在Android中检查实际的互联网可用性实际上非常困难。需要克服许多限制才能做到这一点。

isReachable()方法使用ICMP来ping主机。这可能很难设置。

同样,根据设备、权限、API、OS版本等因素,调用URL也可能受到同样的限制。

如果不必要,就不要这么做。没有一种稳健的方法适用于所有设备。

这不是"Mobile Free"的核心用例,它只管理移动计费(开/关)。

有趣的是,你可以在手机上没有互联网连接的情况下仍然需要缴费。

0

你可以读取wifi当前状态..

SupplicantState supState; 
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();

同时也可以看一下这种方法


0

非常感谢您的建议...

我实际上找到了一些解决方案:

我使用了try\catch:

    try{
    //calling url
    }
    catch(UnknownHostException e){

    e.printStackTrace();

    Connection_error();     
    }

   catch (ConnectException e) {
    e.printStackTrace();
    Connection_error();
            }

谢谢大家...


-1

尝试下面的代码:

public static boolean netConnect(Context ctx) {

    ConnectivityManager cm;
    NetworkInfo info = null;
    try {
        cm = (ConnectivityManager) ctx
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        info = cm.getActiveNetworkInfo();
    } catch (Exception e) {

        e.printStackTrace();
    }
    if (info != null) {
        return true;

    } else {
        return false;
    }
}

HCD: 实际上Wifi已连接...所以这段代码将返回true。如果没有互联网连接到wifi但wifi已连接到设备。设备只是检查wifi是否已连接。 - Mohamed Hisham Ibn Hanifa

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