Определите, есть ли доступное интернет-соединение на Android

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

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

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

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

выдает эту ошибку:

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

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

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

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

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

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

Я проверяю 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 для правильной работы и т. Д.

Шаг 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!!!!");    
}

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

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

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

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

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

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

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

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

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

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

Вероятно, я нашел себя:

ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();
Другие вопросы по тегам