Android: sprawdź sieć i rzeczywistą łączność z Internetem

Poniżej znajduje się fragment kodu Androida, który działa dobrze, aby sprawdzić, czy sieć jest podłączona, czy nie.

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" />

Ale posiadanie aktywnego interfejsu sieciowego nie gwarantuje dostępności określonej usługi sieciowej.

Wiele razy zdarza się, że jesteśmy podłączeni do sieci, ale wciąż nie jesteśmy dostępni do wspólnych usług sieciowych, np. Google

Wspólny scenariusz:

Urządzenie z Androidem podłączone do Wi-Fi, które okazuje się być siecią prywatną. Czy sieć jest dostępna, zwróci tę sieć, ale nie może być połączona z żadną inną usługąCzasami sygnał telefonu pokazuje, że jest on połączony z planem danych usługodawcy. więc połączenie sieciowe jest prawdziwe, ale nadal nie ma dostępu do Google / Yahoo.

Jednym ze sposobów jest sprawdzenie, czy funkcja „isNetworkAvailable” zwraca TRUE, a następnie uruchom następujący kod

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

Ale myślę, że to nie jest dobry sposób, ponieważ może pochłaniać dużo czasu

Czy więc istnieje jakikolwiek alternatywny skuteczny (pod względem czasu, szybkości) sposób zapewnienia, że ​​jesteśmy połączeni z siecią, a także osiągalny dla większości popularnych usług internetowych?

questionAnswers(3)

yourAnswerToTheQuestion