Определите, есть ли подключение к Интернету на Android

Мне нужно определить, подключено ли устройство Android к Интернету.

Класс NetworkInfo предоставляет нестатический метод isAvailable (), который звучит идеально.

Проблема в том, что:

NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
    // do something
}

бросает эту ошибку:

& Лт;!- язык: lang-none - >

The constructor NetworkInfo is not visible.

Безопасная ставка - есть еще один класс, который возвращает объект NetworkInfo. Но я не знаю, какой.

  1. Как заставить вышеупомянутый фрагмент кода работать?
  2. Как я мог найти себе информацию, которая мне нужна в онлайн-документации?
  3. Можете ли вы предложить лучший способ для этого типа обнаружения?
Комментарии к вопросу (6)
Решение

Метод getActiveNetworkInfo () в ConnectivityManager возвращает экземпляр NetworkInfo, представляющий первый подключенный сетевой интерфейс, который он может найти, или null, если ни один из интерфейсов не подключен. Проверка, возвращает ли этот метод null, должна быть достаточной, чтобы определить, доступно ли подключение к Интернету или нет.

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

Вам также понадобится:

в вашем андроидном манифесте.

Редактировать:

Обратите внимание, что наличие активного сетевого интерфейса не гарантирует доступности конкретной сетевой службы. Проблемы с сетью, время простоя сервера, низкий уровень сигнала, невыпадающие порталы, фильтры содержимого и т. П. Могут помешать вашему приложению достичь сервера. Например, вы не можете точно определить, может ли ваше приложение связаться с Twitter, пока не получите действительный ответ от службы Twitter.

Комментарии (28)

Я проверяю как Wi-Fi, так и мобильный интернет следующим образом...

private boolean haveNetworkConnection() {
    boolean haveConnectedWifi = false;
    boolean haveConnectedMobile = false;

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) {
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                haveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                haveConnectedMobile = true;
    }
    return haveConnectedWifi || haveConnectedMobile;
}

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

Комментарии (17)

Шаг 1: Создайте класс AppStatus в вашем проекте (вы также можете указать любое другое имя). Затем вставьте приведенные ниже строки в свой код:

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

public class AppStatus {

    private static AppStatus instance = new AppStatus();
    static Context context;
    ConnectivityManager connectivityManager;
    NetworkInfo wifiInfo, mobileInfo;
    boolean connected = false;

    public static AppStatus getInstance(Context ctx) {
        context = ctx.getApplicationContext();
        return instance;
    }

    public boolean isOnline() {
        try {
            connectivityManager = (ConnectivityManager) context
                        .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        connected = networkInfo != null && networkInfo.isAvailable() &&
                networkInfo.isConnected();
        return connected;

        } catch (Exception e) {
            System.out.println("CheckConnectivity Exception: " + e.getMessage());
            Log.v("connectivity", e.toString());
        }
        return connected;
    }
}

Шаг 2: Теперь, чтобы проверить, есть ли у вашего устройства сетевое подключение, просто добавьте этот фрагмент кода, где вы хотите проверить ...

if (AppStatus.getInstance(this).isOnline()) {

    Toast.makeText(this,"You are online!!!!",8000).show();

} else {

    Toast.makeText(this,"You are not online!!!!",8000).show();
    Log.v("Home", "############################You are not online!!!!");    
}
Комментарии (6)

Также еще одно важное замечание. Вы должны установить android.permission.ACCESS_NETWORK_STATE в вашем AndroidManifest.xml, чтобы это работало.

_ как я мог найти себе информацию, которая мне нужна в онлайн-документации?

Вам просто нужно прочитать документацию классов достаточно правильно, и вы найдете все ответы, которые вы ищете. Проверьте документацию на ConnectivityManager. Описание говорит вам, что делать.

Комментарии (3)

Метод getActiveNetworkInfo () ConnectivityManager возвращает a Экземпляр NetworkInfo, представляющий первую подключенную сеть интерфейс может найти или ноль, если нет, если интерфейсы подключены. Проверка, возвращает ли этот метод null, должна быть достаточной, чтобы определить, является ли an подключение к интернету доступно.

private boolean isNetworkAvailable() {
     ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
     return activeNetworkInfo != null; 
}

Вам также понадобится:

< uses-разрешение android: name = "android.permission.ACCESS_NETWORK_STATE" / > в вашем андроид манифест.

Редактировать:

Обратите внимание, что наличие активного сетевого интерфейса не гарантирует, что a конкретный сетевой сервис доступен. Проблемы с сетями, сервер время простоя, низкий сигнал, порталы с пленкой, фильтры содержимого и тому подобное все это может помешать вашему приложению попасть на сервер. Например ты не могу точно сказать, может ли ваше приложение связаться с Twitter, пока вы не получите действительный ответ от службы Twitter.

getActiveNetworkInfo () никогда не должен давать ноль. Я не знаю, о чем они думали, когда придумали это. Это должно дать вам объект всегда.

Комментарии (1)

Наверное, я нашел себя:

ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();
Комментарии (5)