Статус реального сетевого подключения Android

Как узнать реальное состояние подключения устройства. В моем приложении я зарегистрировался в намерении ConnectivityManager.CONNECTIVITY_ACTION. Получаю интенты, а они говорят, что на устройстве есть подключение:

ConnectivityManager.EXTRA_NO_CONNECTIVITY from intent == false

NetworkInfo ni = connectivityManager.getActiveNetworkInfo();
ni.isAvailable() == true
ni.isConnected() == true

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

Как узнать реальное состояние интернет-соединения?


person Alexander Melnikov    schedule 31.01.2013    source источник
comment
См. комментарий под ответом Габи.   -  person 323go    schedule 31.01.2013


Ответы (3)


Вы можете использовать это, чтобы определить, подключены ли вы:

final ConnectivityManager connectManager = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE);

final NetworkInfo mobile = connectManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
final NetworkInfo wifi   = connectManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI  );

// Return true if connected, either in 3G or wi-fi
return ((mobile != null && mobile.getState() == NetworkInfo.State.CONNECTED) || 
        (wifi   != null && wifi.getState()   == NetworkInfo.State.CONNECTED)   );
}
person jlopez    schedule 31.01.2013

Вы можете использовать приведенный ниже код, чтобы проверить подключение вашего устройства к Интернету. Я надеюсь, что это поможет вам.

 public static boolean IsNetConnected(Context mContext)
{
    boolean NetConnected = false;
    try
    {
        ConnectivityManager connectivity =
                (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity == null)
        {
            NetConnected = false;
        }
        else
        {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null)
            {
                for (int i = 0; i < info.length; i++)
                {
                    if (info[i].getState() == NetworkInfo.State.CONNECTED)
                    {
                        NetConnected = true;
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
        NetConnected = false;
    }
    return NetConnected;
}
person GrIsHu    schedule 31.01.2013

ты прав. Это не 100% точный способ определения статуса подключения, но вы можете попробовать

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 200);
        } catch (IOException e) {
            Log.e(LOG_TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(LOG_TAG, "No network available!");
    }
    return false;
}

Обратите внимание, что Google может быть ограничен в некоторых странах.

person Buda Gavril    schedule 31.01.2013
comment
Этот ответ ближе всего, но он все еще неверен. Вы можете получить 200 от www.google.com, но это может быть не Google, а промежуточная страница или целевая страница горячей точки. Вместо того, чтобы проверять Google и искать код ответа, устройство должно проверять известную веб-страницу и проверять возвращаемый контент. - person 323go; 31.01.2013
comment
если вы так думаете, вы не найдете 100% точного решения... подумайте, что кто-то может испортить таблицу NAT Wi-Fi роутера, и вы можете получить хороший ответ даже с домашней страницы пентагона... - person Buda Gavril; 31.01.2013
comment
вздор. Ваше решение не будет работать в любой точке доступа в Starbucks, McDonald's, аэропорту, GoGo, Wayport и т. д., пока устройство не будет должным образом авторизовано. В реальном мире ваш код не сможет обнаружить недоступный Интернет в 50% случаев. - person 323go; 31.01.2013
comment
Да, я могу сделать это таким образом (я думал об этом), но мой вопрос в другом, т.е. если Android знает реальное состояние, КАК Я МОГУ ПОЛУЧИТЬ ЭТУ ИНФОРМАЦИЮ. Возможно, система делает это таким же образом, но зачем мне делать то же самое, если ОС уже это делает. Я просто хочу знать о. - person Alexander Melnikov; 31.01.2013
comment
Я думаю, что ОС может знать, что синхронизация неоднократно завершается сбоем (см. настройки->учетные записи), и есть красный значок, если синхронизация не удалась (неверный пароль или отсутствие подключения или другая причина, я думаю, ОС может видеть основную причину сбоя синхронизации) - person Buda Gavril; 31.01.2013