Android:检查互联网连接 - 返回true(错误)

时间:2015-02-11 06:50:21

标签: android android-networking android-internet

要检查互联网连接,我使用此代码:

public boolean isOnline() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        //return netInfo != null && netInfo.isConnectedOrConnecting();
        return netInfo != null && netInfo.isAvailable() && netInfo.isConnected();
    }

这是我在任何地方都能找到的最常用的代码 - 但它无法可靠地工作。

虽然我无法使用互联网,但这种情况仍然存在 我的手机上的其他应用正确地给出了消息:'无法连接到互联网'。

编辑1
当互联网连接存在时,它似乎返回true - 即使由于某种原因它不可用。
如果我在手机上关闭移动数据/互联网 - 那么此方法正确返回false。

2 个答案:

答案 0 :(得分:2)

所有人都会告诉您,如果您的设备已连接,他们不会告诉您互联网状态...
为此你应该使用这个代码...

 private boolean isOnline() {
            try{
                // ping to googlevto check internet connectivity
                Socket socket = new Socket();
                SocketAddress socketAddress = new InetSocketAddress("8.8.8.8", 80);
                socket.connect(socketAddress, 3000);
                socket.close();
                return true;
            } catch (Exception e) {
                 // internet not working
                 return false
            }
 }

您必须在异步任务中执行此操作,否则它将为您提供主线程异常的网络...
我假设你已经在异步任务中调用了isOnline方法。

如果你没有在异步任务中使用它,那么 你必须像这样使用它....

例如,您希望仅在互联网可用时才转到xyz活动

private class GoToXYZActivity extends AsyncTask<String, Void, Void> {
     boolean internetAvailable;
     protected String doInBackground(String... urls) {
         //THIS METHOD WILL BE CALLED AFTER ONPREEXECUTE
         //YOUR NETWORK OPERATION HERE
         internetAvailable = inOnline();
         return null;
     }

     protected void onPreExecute() {
         super.onPreExecute();
         //THIS METHOD WILL BE CALLED FIRST
         //DO OPERATION LIKE SHOWING PROGRESS DIALOG PRIOR TO BEGIN NETWORK OPERATION
     }

     protected void onPostExecute(String result) {
         super.onPostExecute();
         //TNIS METHOD WILL BE CALLED AT LAST AFTER DOINBACKGROUND
         //DO OPERATION LIKE UPDATING UI HERE
         if (internetAvailable)
             /// goto xyz activity
         else
             /// toast - no internet
     }
 }

在点击事件中,您必须调用此方法

 new GoToXYZActivity().execute();

答案 1 :(得分:0)

  public boolean isConnectingToInternet(){
        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)
                      {
                          return true;
                      }

          }
          return false;
    }