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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
ILNAR_93
Android
217 / 217 / 21
Регистрация: 19.01.2013
Сообщений: 1,587
Записей в блоге: 2
#1

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

03.12.2015, 17:15. Просмотров 440. Ответов 15
Метки нет (Все метки)

Знаю весь интернет кишит примерами...

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

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

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

Проверка наличия интернет соединения Android
Android RadioButton программным способом
Проверка интернет соединения Android
Android Как выводить сообщение об отсутствии соединения с интернетом?
Android Проверка интернет соединения
Проверка качества соединения с сайтом Android
Android Проверить соединение с интернетом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
2011 / 1753 / 545
Регистрация: 12.05.2014
Сообщений: 6,207
Завершенные тесты: 1
03.12.2015, 17:18     Каким способом вы определяете наличие соединения с интернетом #2
тема уже поднималась не раз и не два, потрудись поискать на форуме в этом разделе
ILNAR_93
Android
217 / 217 / 21
Регистрация: 19.01.2013
Сообщений: 1,587
Записей в блоге: 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
48 / 39 / 3
Регистрация: 28.12.2011
Сообщений: 223
03.12.2015, 17:40     Каким способом вы определяете наличие соединения с интернетом #5
Кто как проверяет наличие интернета в своих приложениях
ILNAR_93
Android
217 / 217 / 21
Регистрация: 19.01.2013
Сообщений: 1,587
Записей в блоге: 2
03.12.2015, 17:42  [ТС]     Каким способом вы определяете наличие соединения с интернетом #6
bastrakov,
вот это как бы правильно..
но как то тоже мудрено))
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
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
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
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
523 / 493 / 111
Регистрация: 12.03.2014
Сообщений: 1,646
Завершенные тесты: 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
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
07.12.2015, 12:28     Каким способом вы определяете наличие соединения с интернетом #13
Да, вообще круто было бы запилить такое:
1. Доступ физический к сети (да/нет).
2. Качество соединения (высокое/среднее/низкое).
3. Вид сети (wifi/мобильный).
Паблито
2011 / 1753 / 545
Регистрация: 12.05.2014
Сообщений: 6,207
Завершенные тесты: 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
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
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

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

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

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

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