Страница 1 из 1

Проверить наличие интернета.

Добавлено: 08 фев 2013, 13:57
dcbp
Добрый день, друзья!
Хотелось бы всё же до конца разобраться как проверить есть ли в данный момент интернет.
Функцию определения подключения в общем-то написал:

Код: Выделить всё

public boolean checkNetworkStatus(Context c){

	     final ConnectivityManager connMgr = (ConnectivityManager) c.getSystemService(c.CONNECTIVITY_SERVICE);

	     NetworkInfo nInfo = connMgr.getActiveNetworkInfo();
	     
	     final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
	     final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

	     if( (wifi.isAvailable() || mobile.isAvailable()) && nInfo.isConnected()) return true;
    	 	     
	     return false;
	}
Ошибка возникает когда вайфай например включён, а вот интернета нет. Как бы ещё и этот момент проверить?

Re: Проверить наличие интернета.

Добавлено: 08 фев 2013, 15:18
Digetix
Добрый. Вы проверяете на одновременное включение и вай-фай и интернет? Просто мой Андроид делает так: если включен обычный, то работает с обычным, если включить вай-фай, то работает вай-фай, а обычный не активен.

Re: Проверить наличие интернета.

Добавлено: 08 фев 2013, 15:34
Finch
Он говорил о проблеме когда вай фай подкл а интернета нет, это можна вызвать искуственно выдергиванием кабеля из WAN порта, что мы имеем? Прально вай фай работает и тел подключен но инета нет =) Прога проходит все проверки, но ловит нуллпоинтер при обработке каких-то запросов.

Re: Проверить наличие интернета.

Добавлено: 08 фев 2013, 16:05
neoksi
Finch писал(а):Он говорил о проблеме когда вай фай подкл а интернета нет, это можна вызвать искуственно выдергиванием кабеля из WAN порта, что мы имеем? Прально вай фай работает и тел подключен но инета нет =) Прога проходит все проверки, но ловит нуллпоинтер при обработке каких-то запросов.
Ну почему сразу NullPointer, если правильно запрос реализован, то просто получаем разрыв по таймауту.

Re: Проверить наличие интернета.

Добавлено: 09 фев 2013, 02:47
Finch
Ключевое слово если =)

Re: Проверить наличие интернета.

Добавлено: 09 фев 2013, 09:23
Mikhail_dev
О каком NullPointerException идет речь? Если это сокеты, то IOException,если HTTP, о там код ошибки получим, 400 или 500.
Теперь о том, как всё же решить проблему. Я думаю всё же своими шаманскими решениями, чего я делать не советую. Есть подключение к WiFi ? Значит ставим, что подключены. Не можем делать запросы? Пишем, что неполадки с интернетом. Всё. Это по мне наилучший вариант.
Если хочется танцов с бубнами, то как вариант: при подключении к интернету, делаем к примеру запрос на какой-нибудь сайт. Если есть ответ, то значит мы подключены. Сайт находим с наименьшим контентом ответа, к примеру time-a.timefreq.bldrdoc.gov по 13 порту. Он возвращает точное время по атомным часам. В основном UNIX машины синхронизируются именно по этому времени.

Re: Проверить наличие интернета.

Добавлено: 10 фев 2013, 05:15
Finch
ну как о каком?
Ошибка возникает когда вайфай например включён, а вот интернета нет. Как бы ещё и этот момент проверить?
что из этого следует? Что прога ждет какие-то данные с инета, но их нет и валится в нуллпоинтер. Как-то так.

Re: Проверить наличие интернета.

Добавлено: 10 фев 2013, 15:19
Mikhail_dev
Повторяю. Неправда это. Она свалится в IOException. Вот к примеру вырезка

Код: Выделить всё

				HttpGet httpGet = new HttpGet( url );
			try {
				origResponse = httpClient.execute(httpGet);
			} catch (ClientProtocolException e) {
				Logger.log("HTTPClient.GET", e);
			} catch (IOException e) { ...}

Re: Проверить наличие интернета.

Добавлено: 12 фев 2013, 08:10
dcbp
Всем спасибо, я решил проблему проверкой на null NetworkInfo

Код: Выделить всё

NetworkInfo nInfo = connMgr.getActiveNetworkInfo();
Ну и условие:

Код: Выделить всё

if( (wifi.isAvailable() || mobile.isAvailable()) && nInfo != null && nInfo.isConnected() ) return true;

Почему так, объяснить не могу, надо много читать наверно, но это хотя бы работает.

Re: Проверить наличие интернета.

Добавлено: 12 фев 2013, 09:17
Mikhail_dev
Судя по коду, проблема не решена.

Re: Проверить наличие интернета.

Добавлено: 28 май 2014, 16:29
n0tb0dy
Добрый день а можно вызывать проверку наличия интернет не самому, ну в каком то методе, а так чтобы мой метод срабатывал тогда когда включают или выключают wifi или мобильный инет?

Ну например сделать простое приложение с одной активностью, которая будет выводить в единственный textView что есть подключение по wifi когда включают wifi или есть подключение через mobile inet когда включают мобильный инет.

Может есть где примерчик глянуть? или может тут кто кодик подбросит?

Гуглил я по этому поводу уже много

http://stackoverflow.com/questions/1569 ... ndroid-app

http://stackoverflow.com/questions/1554 ... 7#15546897

это так два примерчика только... но перерыл гораздо большое

все это начинает работать только когда проверка находится в отдельном классе и в отдельном файле, а так чтобы в коде самой Активити, у меня почему то не получилось реализовать

Re: Проверить наличие интернета.

Добавлено: 28 май 2014, 16:48
yanchumak
n0tb0dy писал(а): все это начинает работать только когда проверка находится в отдельном классе и в отдельном файле, а так чтобы в коде самой Активити, у меня почему то не получилось реализовать
Создай ресивер в активити, подпишись на нужные события и всё.

Re: Проверить наличие интернета.

Добавлено: 28 май 2014, 18:20
n0tb0dy
yanchumak писал(а): Создай ресивер в активити, подпишись на нужные события и всё.
можно примерчик где-нибудь посмотреть как это сделать?

Re: Проверить наличие интернета.

Добавлено: 28 май 2014, 18:40
Viewer
В своей Activity определяешь поле
private BroadcastReceiver mBroadcastReceiver;
и метод для запуска BroadcastReceiver:

[syntax=java]private void startWatchingWiFiState (){
if (mBroadcastReceiver!=null)return;
mBroadcastReceiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub

}
};
//Добавляем фильтр, в фильтр можно добавить еще и другие Action
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(mBroadcastReceiver, filter);
}[/syntax]

Запускаешь где нибудь в onStart и не забыть отменить регистрацию, к примеру, в onStop

[syntax=java] @Override
protected void onStart() {
startWatchingWiFiState ();
}
@Override
protected void onStop() {

if (mBroadcastReceiver != null) {
unregisterReceiver(mBroadcastReceiver);
mBroadcastReceiver = null;
}
}[/syntax]

Естественно в манифесте нужно также прописать нужные разрешения

Re: Проверить наличие интернета.

Добавлено: 28 май 2014, 18:42
n0tb0dy
все спасибо вроде бы все сам нашел, сейчас работаю с примерчиком...

спасибо за пинок в нужном направлении :)

и за ваш примерчик тоже спасибо, обязательно посмотрю

Re: Проверить наличие интернета.

Добавлено: 28 май 2014, 19:00
Viewer
Единственное, стоит отметить, что данный приемник регистрирует только возможность подключения к WiFi (т.е. включен ли он в настройках), но не фактическое подключение к Интернету или даже к точке доступа. Все это нужно отлавливать другими Action, к примеру, SUPPLICANT_STATE_CHANGED_ACTION, SUPPLICANT_CONNECTION_CHANGE_ACTION , как с ними работать нужно будет разобраться.
Из своего опыта могу добавить, что не нужно полагаться на один метод определения, т.к. на разных устройствах некоторые Action могут вообще не приходить.

Re: Проверить наличие интернета.

Добавлено: 29 май 2014, 10:15
n0tb0dy
да, да хорошее, замечание, спасибо

я тоже уже пришел к тому что надо проверять какой-нибудь ресурс в сети