2015-02-11 1 views
1

Чтобы проверить подключение к Интернету, я использую этот код:Android: Проверьте подключение к Интернету - возвращает истину (неправильно)

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(); 
    } 

Это наиболее часто используемый код, который я нашел везде - однако он не работает надежно ,

Это верно, хотя я не могу использовать Интернет.
Другие приложения на моем мобильном телефоне правильно сообщают: «Не удается подключиться к Интернету».

EDIT 1
Оказывается, что она возвращает истину, если подключение к Интернету есть - даже если он является непригодным для использования по какой-то причине.
Если я отключу мобильный телефон/Интернет на своем телефоне, то этот метод правильно вернет значение false.

+0

я думаю, что интернет доступен для вас, но сила связи довольно низкая или не могут обмениваться данными из-за этого плохого соединения. –

+0

Проблема в том, что вы подключены к «NETWORK», но «ИНТЕРНЕТ» «НЕ ДОСТУПНО». – dhuma1981

+0

Pramod> Да, похоже, так. Я добавил дополнительную информацию к вопросу. – Jasper

ответ

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; 
    } 
+0

какое совпадение .......... –

+0

серьезно ..: DI был задержан на 7 секунд .. :(: D –

+0

никаких проблем Я сейчас работаю над gps that's почему я использую этот метод, чтобы проверить подключение к Интернету в моем приложении, где вы сейчас работаете ......... –

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 
      } 
} 

Вы должны сделать это в async-задании или он даст вам сеть по исключению основного потока ...
Я предполагаю, что вы уже вызываете метод isOnline в async-задаче.

Ну, если вы не используете это в задаче асинхронным,
Вы должны использовать его здесь, как это ....

, например, вы хотите, чтобы перейти к хуг деятельности, только если интернет

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(); 
+0

это выкинет NetworkOnMainThreadException. –

+0

@NeetSoni да, я отредактировал мое сообщение – Salmaan

+0

Можно ли открыто открывать сокеты в андроиде - какие-либо последствия этого? – Jasper