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

StackOverflow https://stackoverflow.com/questions/4238921

Вопрос

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

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

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

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

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

The constructor NetworkInfo is not visible.

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

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

Решение

То 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.

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

Обратите внимание, что наличие активного сетевого интерфейса не гарантирует, что конкретная сетевая служба доступен. Сетевые проблемы, время простоя сервера, низкий сигнал, невыполненные порталы, фильтры контента и тому подобное могут предотвратить ваше приложение от достижения сервера. Например, вы не можете сказать наверняка, если ваше приложение может добраться до 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 для этого работать.

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

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

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

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

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

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

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

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

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

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

ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top