Как проверить интернет доступен в Wi-Fi (хотя Wi-Fi подключен)

Я использовал этот код, чтобы проверить доступность интернета или нет..

    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;

Но то, что я хочу, это:

Предположим, что Wi-Fi подключен, но нет интернета в Wi-Fi... как проверить интернет-данные доступны в Wi-Fi, хотя Wi-Fi подключен... если я использую Abouve-код, он просто проверяет, подключен или отключен Wi-Fi... будет благодарен, если кто-то даст мне решение...

6 ответов

Решение

Проще всего отправить HTTP-запрос, и если ваш HTTP-запрос истек, у вас нет подключения к Интернету или вы можете проверить код ответа. Упомянутое вами условие возникает, когда вы подключены к WiFi, но маршрутизатор WiFi не имеет активного подключения к провайдеру. Лучше всего полагаться на http запрос imo.

Вот пример кода:

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 прав.

также здесь есть код для проверки интернета WIFI и включения / выключения режима полета. Если вы создаете веб-приложение, режим полета должен обрабатываться

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

Только что проработал это для последнего названия "Мобильный бесплатно" в магазине 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 для проверки связи с хостом. Это может быть трудно настроить.

Аналогичным образом, вызов URL может быть в равной степени ограничен в зависимости от устройства, прав доступа, API, версии ОС и т. Д.

Если вам не нужно это делать, не надо. Не существует надежного способа, который будет работать на всех устройствах.

Это был не основной вариант использования Mobile Free, который просто управляет мобильным биллингом (вкл / выкл).

Интересно отметить, что на самом деле вы можете быть на мобильном телефоне, но без интернета и при этом быть платным.

Вы можете прочитать текущее состояние Wi-Fi..

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

Также взгляните на этот подход.

Большое спасибо за предложение...

На самом деле я нашел некоторые решения:

я использовал try\catch:

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

    e.printStackTrace();

    Connection_error();     
    }

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

Спасибо всем...

Попробуйте ниже код:-

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;
    }
}
Другие вопросы по тегам