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

Возможный дубликат:
Как проверить доступ в Интернет на Android? InetAddress никогда не истекает время ожидания

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

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

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

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

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

The constructor NetworkInfo is not visible.

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

  • Как получить приведенный выше фрагмент кода?
  • Как я мог найти информацию, необходимую мне в онлайн-документации?
  • Можете ли вы предложить лучший способ для этого типа обнаружения?

Ответ 1

Метод 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" />

в манифесте Android.

Edit:

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

Ответ 2

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

Ответ 3

Шаг 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 t = Toast.makeText(this,"You are online!!!!",8000).show();

} else {

    Toast t = Toast.makeText(this,"You are not online!!!!",8000).show();
    Log.v("Home", "############################You are not online!!!!");    
}

Ответ 4

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

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

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

Ответ 5

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

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

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

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

Edit:

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

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

Ответ 6

Возможно, я нашел себя:

ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();