Страницы

понедельник, 29 ноября 2010 г.

Как проверить доступность интернета

Неоднократно на просторах интернета встречал примеры по теме проверки доступности интернета на устройстве. В них обычно создавали подключение к какому-нибудь сайту и ловили исключения. Если всё прошло без исключения, значит интернет доступен.

По моему мнению, это неверно. Можно использовать стандартные методы из SDK. Конкретнее, класс ConnectivityManager. Он как раз и предназначен для получения информации об активных подключениях.


Для использования класса необходимо добавить разрешение android.permission.ACCESS_NETWORK_STATE в манифест.
Данный класс можно использовать, например, так (проверка доступности мобильного интернета):
String cs = Context.CONNECTIVITY_SERVICE;
ConnectivityManager cm = (ConnectivityManager)
    getSystemService(cs);
cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);


* This source code was highlighted with Source Code Highlighter.
или так (проверка доступности WiFi):
String cs = Context.CONNECTIVITY_SERVICE;
ConnectivityManager cm = (ConnectivityManager)
    getSystemService(cs);
cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);


* This source code was highlighted with Source Code Highlighter.
и проверить состояние DetailedState возвращаемого объекта NetworkInfo.

Для проверки доступности конкретного хоста можно использовать следующий код:
String cs = Context.CONNECTIVITY_SERVICE;
ConnectivityManager cm = (ConnectivityManager)
    getSystemService(cs);
cm.requestRouteToHost(TYPE_WIFI, int hostAddress);


* This source code was highlighted with Source Code Highlighter.
где hostAddress - IP адрес хоста.

Ну а если совсем всё упростить, то можно воспользоваться примерно таким методом:
public boolean isOnline() {
  String cs = Context.CONNECTIVITY_SERVICE;
  ConnectivityManager cm = (ConnectivityManager)
    getSystemService(cs);
  if (cm.getActiveNetworkInfo() == null) {
    return false;
  }
  return     cm.getActiveNetworkInfo().isConnectedOrConnecting();
}


* This source code was highlighted with Source Code Highlighter.

4 комментария:

  1. А не подскажете, как программно включить (отключить) точку доступа wifi (portable hotspot)?

    Иначе приходится делать много действий: меню-настройки-беспроводные сети-режим модема-точка доступа

    ОтветитьУдалить
    Ответы
    1. Вас интересует реализация такой программы? Попробую посмотреть, если что-то найду – напишу.

      Удалить
    2. Собственно, нашёл ответ: http://stackoverflow.com/a/3388910/436938
      Открытого API в данный момент нет, только через reflection это можно сделать. Это не гарантирует работу на всех устройствах, да и вообще не гарантирует работоспособность.
      Если порыться в исходниках WifiManager'а, то можно найти все нужные методы: getWifiApState(), getWifiApConfiguration(), setWifiApEnabled()

      Удалить
    3. Есть и более полный ответ с примером реализации: http://stackoverflow.com/a/7049074/436938

      Удалить