Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
ILNAR_93
Android
236 / 236 / 49
Регистрация: 19.01.2013
Сообщений: 1,851
Записей в блоге: 3
#1

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

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

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

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

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

Спасибо!))
http://www.cyberforum.ru/android-dev/thread1150914.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2015, 17:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Каким способом вы определяете наличие соединения с интернетом (Программирование Android):

Проверка Socket на наличие соединения
Помогите сделать проверку сокета перед подключением. public void...

Как проверить наличие соединения с Интернетом\Сетью
Привет всем. :) Вопрос простой и в гугле много ссылок и решений, но то что...

Проверка соединения с интернетом
Будет ли исправно работать этот способ на всех компьютерах? На форме компонент...

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

Скорость соединения с интернетом
Есть такое системное требование: Скорость Интернет-соединения: 256 Kbps ...

15
Pablito
2646 / 2128 / 726
Регистрация: 12.05.2014
Сообщений: 7,439
Завершенные тесты: 1
03.12.2015, 17:18 #2
тема уже поднималась не раз и не два, потрудись поискать на форуме в этом разделе
1
ILNAR_93
Android
236 / 236 / 49
Регистрация: 19.01.2013
Сообщений: 1,851
Записей в блоге: 3
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;
 
    }
0
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
03.12.2015, 17:32 #4
у меня универсальный способ - работает всегда: взять данные с известного сервака.
чаще всего на сервере делается метод echo, который возвращает или OK, или текущее время.
ну и все вызовы серверные тоже должны что-то осмысленное возвращать. передавать данные "в никуда" без проверки - не есть путь самурая. :-)
2
Hank
63 / 54 / 4
Регистрация: 28.12.2011
Сообщений: 297
03.12.2015, 17:40 #5
http://www.cyberforum.ru/post7830603.html
1
ILNAR_93
Android
236 / 236 / 49
Регистрация: 19.01.2013
Сообщений: 1,851
Записей в блоге: 3
03.12.2015, 17:42  [ТС] #6
bastrakov,
вот это как бы правильно..
но как то тоже мудрено))
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
07.12.2015, 08:52 #7
bastrakov, напиши код, тоже хочу поменять на запрос у сервера, а то бывает wifi есть, а инета нет.
0
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;
    }
1
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
07.12.2015, 11:02 #9
Никаких шуток. А запрос я имел ввиду к серверам гугла, типа 8.8.8.8, бо urlString может запросить неотвечающий адрес.
0
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
07.12.2015, 11:17 #10
ануок.
в большинстве нормальных проектов, сервер - свой. и как я писал выше, на нем делают примитивное "эхо", которое может возвращать или просто ОК, или некую осмысленную инфу, типа: времени, имени инстанса, id сессии.
для публичных проектов можно использовать любой публичный сервис: yahoo или там какойнить google, да даже мало кому известный ты-ндекс например. :-)
1
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
07.12.2015, 11:31 #11
Цитата Сообщение от bastrakov Посмотреть сообщение
сервер - свой. и как я писал выше, на нем делают примитивное "эхо"
А если свой, можно же все что он возвращает оборачивать в json с ключем, например, error. И в нем ошибка если есть, если нет еще какое поле добавить. А если нет и того и другого - значит вернулась ерунда (либо заглушка от wifi, либо не весь ответ дошел и т.д.). Плюс в том что не нужно делать доп. запросов. Ну и при отдельном запросе на проверку есть еще шанс на то что между проверкой и реальным запросом что-то произошло и данные получены не те, которые ожидаешь.
1
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
07.12.2015, 11:44 #12
...допишу.
в одном из проектов, мы использовали еще одни плюс "эха" - замер времени ответа. и его использовали в качестве индикатора "качества интернета". ни у для своих нужд, типа "при медленном канале, ограничить количество записей в ответе...".
1
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
07.12.2015, 12:28 #13
Да, вообще круто было бы запилить такое:
1. Доступ физический к сети (да/нет).
2. Качество соединения (высокое/среднее/низкое).
3. Вид сети (wifi/мобильный).
0
Pablito
2646 / 2128 / 726
Регистрация: 12.05.2014
Сообщений: 7,439
Завершенные тесты: 1
07.12.2015, 14:00 #14
Лучший ответ Сообщение было отмечено ILNAR_93 как решение

Решение

я немного напрягся, может что-то из этого и выйдет
проверяем пинги на гугловский 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)
6
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
10.12.2015, 21:36 #15
Лучший ответ Сообщение было отмечено ILNAR_93 как решение

Решение

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;
}
Осталось скрестить оба варианта.
1
Pablito
2646 / 2128 / 726
Регистрация: 12.05.2014
Сообщений: 7,439
Завершенные тесты: 1
11.12.2015, 16:58 #16
я видел этот код, не проверял, но уверен на 90% что он не рабочий
полагаться на ответ от waitFor() ?

переменная просто покажет что процесс выполнился нормально, что его не прервали, только и всего
0
11.12.2015, 16:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2015, 16:58
Привет! Вот еще темы с решениями:

Проверка соединения с интернетом
Нужен самый простой код, проверки соединения с интернетом. Перерыл кучу...

Ярлык соединения с интернетом
Создали на рабочем столе ярлык соединения с интернетом. Запускаем - все...

Проверка соединения с интернетом
Вообщем я тут сидел и думал как проверить интернет, и вот надумал такой простой...

Проверка соединения с интернетом
Здравствуйте уважаемые обитатели. Я через свою программу, скачиваю из интернета...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru