Форум программистов, компьютерный форум CyberForum.ru

Каким способом вы определяете наличие соединения с интернетом - Android

Войти
Регистрация
Восстановить пароль
 
ILNAR_93
Android
212 / 212 / 21
Регистрация: 19.01.2013
Сообщений: 1,528
Записей в блоге: 2
03.12.2015, 17:15     Каким способом вы определяете наличие соединения с интернетом #1
Знаю весь интернет кишит примерами...

Но вот каким "хорошим", оптимальным решением пользуетесь вы товарищи?

Есть ли заложенный метод для определения наличия интернета.. т.е. например вроде бы соединение есть но доступа к сети нет.. Вот как знать что есть доступ к сети?))

Спасибо!))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2015, 17:15     Каким способом вы определяете наличие соединения с интернетом
Посмотрите здесь:

Проверка наличия интернет соединения Android
Android RadioButton программным способом
Проверка интернет соединения Android
Android Как выводить сообщение об отсутствии соединения с интернетом?
Android Проверка интернет соединения
Проверка качества соединения с сайтом Android
Android Проверить соединение с интернетом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
резкий
1890 / 1624 / 505
Регистрация: 12.05.2014
Сообщений: 5,849
Завершенные тесты: 1
03.12.2015, 17:18     Каким способом вы определяете наличие соединения с интернетом #2
тема уже поднималась не раз и не два, потрудись поискать на форуме в этом разделе
ILNAR_93
Android
212 / 212 / 21
Регистрация: 19.01.2013
Сообщений: 1,528
Записей в блоге: 2
03.12.2015, 17:29  [ТС]     Каким способом вы определяете наличие соединения с интернетом #3
буду наверно пользоваться этим примером
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public boolean isNetworkOnline(Context context) {
        boolean status = false;
        try {
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getNetworkInfo(0);
            if (netInfo != null && netInfo.getState() == NetworkInfo.State.CONNECTED) {
                status = true;
            } else {
                netInfo = cm.getNetworkInfo(1);
                if (netInfo != null && netInfo.getState() == NetworkInfo.State.CONNECTED)
                    status = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return status;
 
    }
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
03.12.2015, 17:32     Каким способом вы определяете наличие соединения с интернетом #4
у меня универсальный способ - работает всегда: взять данные с известного сервака.
чаще всего на сервере делается метод echo, который возвращает или OK, или текущее время.
ну и все вызовы серверные тоже должны что-то осмысленное возвращать. передавать данные "в никуда" без проверки - не есть путь самурая. :-)
Hank
42 / 33 / 2
Регистрация: 28.12.2011
Сообщений: 209
03.12.2015, 17:40     Каким способом вы определяете наличие соединения с интернетом #5
Кто как проверяет наличие интернета в своих приложениях
ILNAR_93
Android
212 / 212 / 21
Регистрация: 19.01.2013
Сообщений: 1,528
Записей в блоге: 2
03.12.2015, 17:42  [ТС]     Каким способом вы определяете наличие соединения с интернетом #6
bastrakov,
вот это как бы правильно..
но как то тоже мудрено))
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,067
07.12.2015, 08:52     Каким способом вы определяете наличие соединения с интернетом #7
bastrakov, напиши код, тоже хочу поменять на запрос у сервера, а то бывает wifi есть, а инета нет.
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
07.12.2015, 09:40     Каким способом вы определяете наличие соединения с интернетом #8
принял за шутку, но вот код - не жалко.
Java
1
2
3
4
5
6
7
8
9
10
11
12
    //взять из инета.
    private InputStream downloadUrl(String urlString) throws IOException {
        URL url = new URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        conn.connect();
        InputStream stream = conn.getInputStream();
        return stream;
    }
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,067
07.12.2015, 11:02     Каким способом вы определяете наличие соединения с интернетом #9
Никаких шуток. А запрос я имел ввиду к серверам гугла, типа 8.8.8.8, бо urlString может запросить неотвечающий адрес.
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
07.12.2015, 11:17     Каким способом вы определяете наличие соединения с интернетом #10
ануок.
в большинстве нормальных проектов, сервер - свой. и как я писал выше, на нем делают примитивное "эхо", которое может возвращать или просто ОК, или некую осмысленную инфу, типа: времени, имени инстанса, id сессии.
для публичных проектов можно использовать любой публичный сервис: yahoo или там какойнить google, да даже мало кому известный ты-ндекс например. :-)
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
07.12.2015, 11:31     Каким способом вы определяете наличие соединения с интернетом #11
Цитата Сообщение от bastrakov Посмотреть сообщение
сервер - свой. и как я писал выше, на нем делают примитивное "эхо"
А если свой, можно же все что он возвращает оборачивать в json с ключем, например, error. И в нем ошибка если есть, если нет еще какое поле добавить. А если нет и того и другого - значит вернулась ерунда (либо заглушка от wifi, либо не весь ответ дошел и т.д.). Плюс в том что не нужно делать доп. запросов. Ну и при отдельном запросе на проверку есть еще шанс на то что между проверкой и реальным запросом что-то произошло и данные получены не те, которые ожидаешь.
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
07.12.2015, 11:44     Каким способом вы определяете наличие соединения с интернетом #12
...допишу.
в одном из проектов, мы использовали еще одни плюс "эха" - замер времени ответа. и его использовали в качестве индикатора "качества интернета". ни у для своих нужд, типа "при медленном канале, ограничить количество записей в ответе...".
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,067
07.12.2015, 12:28     Каким способом вы определяете наличие соединения с интернетом #13
Да, вообще круто было бы запилить такое:
1. Доступ физический к сети (да/нет).
2. Качество соединения (высокое/среднее/низкое).
3. Вид сети (wifi/мобильный).
Паблито
резкий
1890 / 1624 / 505
Регистрация: 12.05.2014
Сообщений: 5,849
Завершенные тесты: 1
07.12.2015, 14:00     Каким способом вы определяете наличие соединения с интернетом #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
я немного напрягся, может что-то из этого и выйдет
проверяем пинги на гугловский dns - у него аптайм практически 100%, если на него не идут пинги, либо нет инета либо вы за http прокси сервером (что случается не так часто и это тема отдельного разговора)

методы помещаем где-то в MainActivity, я не стал делать с помощью интерфейсов, половина народа не осилит, а кто осилит и сам переделает
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    private void onInternetChecked(boolean hasInternet) {
        if (hasInternet) Toast.makeText(this, "таки есть", Toast.LENGTH_SHORT).show();
        else Toast.makeText(this, "таки нету", Toast.LENGTH_SHORT).show();
    }
 
    private static void checkInternet(final MainActivity context) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean result = false;
                try {
                    Process p = Runtime.getRuntime().exec("ping -c 3 8.8.8.8");
                    BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
                    String inputLine;
                    StringBuilder sb = new StringBuilder();
                    while ((inputLine = in.readLine()) != null) sb.append(inputLine);
                    Pattern pattern = Pattern.compile(", (\\d+)% packet loss,");
                    Matcher m = pattern.matcher(sb.toString());
                    int loss = 100;
                    if (m.find()) loss = Integer.parseInt(m.group(1));
                    if (loss > -1 && loss < 100) result = true;
                    in.close();
                } catch (IOException ignored) {
                }
                final boolean finalResult = result;
                context.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        context.onInternetChecked(finalResult);
                    }
                });
            }
        }).start();
    }
манифест
XML
1
    <uses-permission android:name="android.permission.INTERNET" />
если коротко, то проверяем строку ответа на пинги, если там есть подстрока, содержащая % потерь от 0 до 99 значит инет есть, иначе его нет

проверил на эмуляторе и телефоне по wifi и 3g (с серым ip)
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,067
10.12.2015, 21:36     Каким способом вы определяете наличие соединения с интернетом #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C интерфейсами не то что надо, сделал так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static boolean checkInternet2() {
    Runtime runtime = Runtime.getRuntime();
    try {
        Process mIpAddrProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int mExitValue = mIpAddrProcess.waitFor();
        Log.d("Internet", "mExitValue " + mExitValue);
        if (mExitValue == 0) {
            return true;
        } else {
            return false;
        }
    } catch (InterruptedException ignore) {
        ignore.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}
Осталось скрестить оба варианта.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2015, 16:58     Каким способом вы определяете наличие соединения с интернетом
Еще ссылки по теме:

Android Автоматическое управление 2G интернетом
Обработка обрыва соединения Android
Android Ошибка соединения с сервером после обновления OC с 4.4 до 5
Android Проверка соединения с сайтом через HttpUrlConnection
Проверка Socket на наличие соединения Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Паблито
резкий
1890 / 1624 / 505
Регистрация: 12.05.2014
Сообщений: 5,849
Завершенные тесты: 1
11.12.2015, 16:58     Каким способом вы определяете наличие соединения с интернетом #16
я видел этот код, не проверял, но уверен на 90% что он не рабочий
полагаться на ответ от waitFor() ?

переменная просто покажет что процесс выполнился нормально, что его не прервали, только и всего
Yandex
Объявления
11.12.2015, 16:58     Каким способом вы определяете наличие соединения с интернетом
Ответ Создать тему
Опции темы

Текущее время: 11:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru