2014-01-10 3 views
2

Ниже приведен фрагмент кода Android, который отлично работает, чтобы проверить, подключена ли сеть.Android: проверьте сеть и реальное подключение к Интернету

public static boolean isNetworkAvailable(Context context) 
{ 
    ConnectivityManager mConnectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    return (mConnectivityManager != null && mConnectivityManager.getActiveNetworkInfo().isConnectedOrConnecting()) ? true : false; 
} 

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

Но наличие активного сетевого интерфейса не гарантирует, что определенная сетевая услуга доступна.

Прошло много времени, что мы подключены к сети, но до сих пор недоступны для общих интернет-сервисов сети, например. Google

Общий сценарий:

  1. Android устройство подключено к Wi-Fi, который оказывается частной сети. Так isNetworkAvailable вернет, что сеть подключена, но может не подключиться к какой-либо другой услуге
  2. Несколько раз сигнал телефона показывает, что он подключен к тарифному плану поставщика услуг. поэтому сетевое подключение верно, но до сих пор не может получить доступ к Google/Yahoo.

Один из способов проверить, если «isNetworkAvailable» функция возвращает TRUE, а затем запустить следующий код

HttpGet request = new HttpGet(url)); 
    HttpParams httpParameters = new BasicHttpParams(); 
    int timeoutConnection = 60000; 
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
    int timeoutSocket = 60000; 
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

    DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); 
    request.addHeader("Content-Type", "application/json"); 
    HttpResponse response = httpClient.execute(request); 

    HttpEntity entity = response.getEntity(); 


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

    } 
catch (SocketException e) 
    { 
    return "Socket Exceptiopn:" + e.toString(); 
    } 
catch (Exception e) 
    { 
    return "General Execption:" + e.toString(); 
    } 

Но я думаю, что это не является хорошим способом, потому что он может потреблять много времени

Итак, есть ли альтернативные эффективные (с точки зрения времени, скорости) способы обеспечения того, чтобы мы были подключены к сети, а также доступны для большинства обычных интернет-сервисов?

+0

Это хороший способ проверить, но вы можете написать организованным способом в заданном ответе по вашему вопросу. –

+1

Я предлагаю вам ознакомиться с этим http://stackoverflow.com/questions/8919083/checking-host-reachability-availability-in-android –

ответ

1

проверить этот код ... он работал для меня :)

public static void isNetworkAvailable(final Handler handler, final int timeout) { 

     // ask fo message '0' (not connected) or '1' (connected) on 'handler' 
     // the answer must be send before before within the 'timeout' (in milliseconds) 

     new Thread() { 

      private boolean responded = false; 

      @Override 
      public void run() { 

       // set 'responded' to TRUE if is able to connect with google mobile (responds fast) 

       new Thread() { 

        @Override 
        public void run() { 
         HttpGet requestForTest = new HttpGet("http://m.google.com"); 
         try { 
          new DefaultHttpClient().execute(requestForTest); // can last... 
          responded = true; 
         } catch (Exception e) {} 
        } 

       }.start(); 

       try { 
        int waited = 0; 
        while(!responded && (waited < timeout)) { 
         sleep(100); 
         if(!responded) { 
          waited += 100; 
         } 
        } 
       } 
       catch(InterruptedException e) {} // do nothing 
       finally { 
        if (!responded) { handler.sendEmptyMessage(0); } 
        else { handler.sendEmptyMessage(1); } 
       } 

      } 

     }.start(); 

} 

Затем я определяю обработчик:

Handler h = new Handler() { 

    @Override 
    public void handleMessage(Message msg) { 

     if (msg.what != 1) { // code if not connected 

     } else { // code if connected 

     } 

    } 
}; 

и запустить тест:

isNetworkAvailable(h,2000); // get the answser within 2000 ms 

Код от Gilbou https://stackoverflow.com/a/5803489/2603719

Я надеюсь, что я могу помочь вам

+0

Спасибо! Но насколько эффективнее (с точки зрения времени), чем мой код? – RDX

+1

Вы также можете установить таймер. '@Override \t protected void onCreate (Bundle savedInstanceState) { \t \t super.onCreate (savedInstanceState); Handler ч = Handler() { \t \t // \t \t // @Override общественного недействительными handleMessage (сообщ Message) { , если (не msg.what! = 1) {// НЕТ ИНТЕРНЕТ} Else {// ИНТЕРНЕТ } } }; isNetworkAvailable (h, 2000);} ' – elHomer

+0

это кажется лучшим подходом! – RDX

1

Выпуск № 1:
Android устройства, подключенного к Wi-Fi, который оказывается частной сети.
Таким образом, isNetworkAvailable вернет, что сеть подключена, но не может быть подключена к какой-либо другой услуге.

Выпуск № 2:
Иногда сигнал телефона показывает, что это связано с планом данных поставщика услуг. поэтому сетевое подключение верно, но по-прежнему не может получить доступ к google/yahoo.

I'm not sure about Issue #1 but I'm sure that following approach will solve Issue #2. 

В конце концов, вы должны Monitor изменения в сети связи,

Шаг 1:

Просто зарегистрировать BroadcastReceiver для следующих действий

<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>

Шаг 2:

, когда вы получаете обратный вызов по методу onReceive(Context context,Intent intent), проверьте состояние подключения.

т.е. boolean isConnected = getIntent().getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY);

// кроме EXTRA_NO_CONNECTIVITY, есть и другие параметры, также, которые будут полезны для мониторинга

Ориентир:

Примеры:

Working Example of Step1,Step2: how-to-monitor-network-connectivity-in-android

Android-getting-notified-of-connectivity-changes

Github: Example for network-detect-notify

Android Docs:

Connectivity Monitoring

Connectivity Manager

Я надеюсь, что это будет полезно !!

0

Используйте этот код для проверки подключения к Интернету, он проверяет все подключение к Интернету через устройство. И убедитесь, что вы добавили интернет-разрешение в манифест.

 boolean flag=false; 
     ConnectivityManager connectivity = (ConnectivityManager) getApplicationContext().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) 
        { 
         flag=true; 

        } 

     } 
     if(flag==true) 
     { 
      Log.e("TAG","Internet Is Connected"); 
     } 
     else 
     { 
       Log.e("TAG","Internet Is Not Connected"); 
     } 
Смежные вопросы