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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.96
mcGurov
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 99
#1

Проверка интернет соединения - Android

07.06.2014, 09:59. Просмотров 3211. Ответов 16
Метки нет (Все метки)

Как же всё-таки прописать грамотную проверку интернет соединения?

Необходимо при включенном wi-fi и отсутствии интернета в WebView выводить необходимые сообщения.

Код такой: (на основе http://forum.startandroid.ru/viewtopic.php?f=41&t=3022)
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import java.net.HttpURLConnection;
import java.net.URL;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebSettings;
import android.webkit.WebView;
 
public class NewsActivity extends Activity {
    
    WebView mWebViewNews;
    WebView mWebViewStock;
    WebView mWebViewPrice;
    
    final static String TAG ="mylog";
    Thread t2, t3;
    int existInternet =0;
    
    String News = "<html><body>Нет интернет соединения. \n </body></html>";
    String Stock = "<html><body>Проверьте ваше интернет подключение </body></html>";
    String Price = "<html><body>Проверьте ваше интернет подключение </body></html>";
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news);
         
        mWebViewNews = (WebView) findViewById (R.id.webViewNews);
        mWebViewStock = (WebView) findViewById (R.id.webViewStock);
        mWebViewPrice = (WebView) findViewById (R.id.webViewPrice);
            
    Log.d(TAG, "---- start---------");             
    
    t2 = new Thread(new Runnable() {
                    public void run() {    
                                            checkConnectivity("http://tpk-tek.ru/pda/index/news_mobile/0-21/");                         
                    }
            });
   
    t3 = new Thread(new Runnable() {
                    public void run() {                                                  
                             try { 
                                     Thread.sleep(1000); // это 1 секунда,
                                     // нужно настроить для вашего соединения, сколько готовы ждать ответа
                                    if (t2.isAlive())  {
                                            //existInternet = 0; // интернета нет
                                            t2.interrupt();
                                            t2.stop();
                                    }                              
                                   
                                    
                                    Log.d(TAG, "---- internet: " + existInternet);
                            } catch (InterruptedException e) {                                     
                                    e.printStackTrace();                                   
                            }                                      
                    }
            });
   
            t2.start();            
            t3.start();
           
            try {
                    t3.join(); // ожидание завершения потока t3
            } catch (InterruptedException e) {
                    e.printStackTrace();
            }
            Log.d(TAG, "----Main internet: " + existInternet);
}
     
public void checkConnectivity(String url)  {
    try{  
            HttpURLConnection.setFollowRedirects(false);           
        HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection();          
       // conn.setRequestMethod("HEAD");
        conn.setRequestMethod("GET");
            if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) {  
                            existInternet = 1; // интернет есть                        
            }
            
            
            
    }catch(Exception e) {
            Log.d(TAG, "error: " + e); // на ошибку можно не обращать внимание              
    }   
    
 
// отображение данных если URL доступен
if (existInternet == 1) mWebViewNews.loadUrl("http://tpk-tek.ru/pda/index/news_mobile/0-21/");
if (existInternet == 1) mWebViewStock.loadUrl("http://tpk-tek.ru/pda/index/stock_mobile/0-22");
if (existInternet == 1) mWebViewPrice.loadUrl("http://tpk-tek.ru/pda/index/skachat_prajs/0-7");
    
 
// решаем проблеммы с кодировкой
WebSettings settingsNews = mWebViewNews.getSettings();
settingsNews.setDefaultTextEncodingName("utf-8");
 
// отображение данных если URL недоступен
if (existInternet == 0) mWebViewNews.loadDataWithBaseURL(null, News, "text/html", "utf-8", null);
 
WebSettings settingsStock = mWebViewStock.getSettings();
settingsStock.setDefaultTextEncodingName("utf-8");
if (existInternet == 0) mWebViewStock.loadDataWithBaseURL(null, Stock, "text/html", "utf-8", null);
 
WebSettings settingsPrice = mWebViewPrice.getSettings();
settingsPrice.setDefaultTextEncodingName("utf-8");
if (existInternet == 0) mWebViewPrice.loadDataWithBaseURL(null, Price, "text/html", "utf-8", null);
    
 
}
}
Но тут извечная проблема, ели wi-fi включен, а интернета нет - то приложение вылетает!

Приложение работает корректно либо при включенном wi-fi и рабочем интернете, либо при выключенном wi-fi.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2014, 09:59     Проверка интернет соединения
Посмотрите здесь:

Проверка наличия интернет соединения Android
Проверка internet connection. Проверка доступности сети Android
Android Как сделать лог интернет соединения Android приложения
Проверка интернет соединения Android
Android Как выводить сообщение об отсутствии соединения с интернетом?
Проверка качества соединения с сайтом Android
Обработка обрыва соединения Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
07.06.2014, 13:42     Проверка интернет соединения #2
Цитата Сообщение от mcGurov Посмотреть сообщение
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) { *
* * * * * * * * * * * * * * existInternet = 1; // интернет есть * * * * * * * * * * * *
* * * * * * }
неверно. Любой HttpStatus говорит о том, что интернет есть. А вот SocketTimeoutException, ConnectionRefused, UnknownHostException которые можно словить в catch (Exception e) говорит о том, что интернета нет.

Если Вам нужно проверять непосредственно перед запросом - это одна ситуация. Если Вам нужно постоянно следить за интернетом и мгновенно проверять его состояние - это другая. Что именно нужно?
mcGurov
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 99
07.06.2014, 14:11  [ТС]     Проверка интернет соединения #3
Необходимо проверять интернет при переходе на активность с WebView, если есть интернет, то грузится текст по URL, если нет, то выводится какое нить сообщение...
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
07.06.2014, 14:19     Проверка интернет соединения #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
mcGurov, попробуйте так:

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;
 
    }
вернёт true если интернет есть, false если нет
mcGurov
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 99
07.06.2014, 14:38  [ТС]     Проверка интернет соединения #5
Eclipse ругается на isNetworkOnline Illegal modifier for parameter isNetworkOnline; only final is permitted
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
07.06.2014, 14:56     Проверка интернет соединения #6
mcGurov, покажите листинг класса
mcGurov
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 99
07.06.2014, 15:12  [ТС]     Проверка интернет соединения #7
Туплю похоже страшно, т.к. многого не знаю...
Теперь ругается на скобки (Context context) 38 строка...

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.net.HttpURLConnection;
import java.net.URL;
 
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebSettings;
import android.webkit.WebView;
 
public class NewsActivity extends Activity {
    
    WebView mWebViewNews;
    WebView mWebViewStock;
    WebView mWebViewPrice;
    
    final static String TAG ="mylog";
    Thread t2, t3;
    int existInternet =0;
    boolean status = false;
    
    String News = "<html><body>Нет интернет соединения. \n </body></html>";
    String Stock = "<html><body>Проверьте ваше интернет подключение </body></html>";
    String Price = "<html><body>Проверьте ваше интернет подключение </body></html>";
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news);
         
        mWebViewNews = (WebView) findViewById (R.id.webViewNews);
        mWebViewStock = (WebView) findViewById (R.id.webViewStock);
        mWebViewPrice = (WebView) findViewById (R.id.webViewPrice);
            
        boolean isNetworkOnline (Context context) {
            
            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;
     
        }
************
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
09.06.2014, 09:43     Проверка интернет соединения #8
mcGurov, а зачем Вы метод в метод запихнули?) Вынесите его оттуда.
mcGurov
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 99
09.06.2014, 10:08  [ТС]     Проверка интернет соединения #9
Всё верно! Спасибо!
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
09.06.2014, 10:12     Проверка интернет соединения #10
mcGurov, контекст в Вашем случае это this. Т.е. можно вызвать boolean isNetworkOnlineNow = isNetworkOnline(this);
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
09.06.2014, 19:35     Проверка интернет соединения #11
Цитата Сообщение от YuraAAA Посмотреть сообщение
постоянно следить за интернетом и мгновенно проверять его состояние
А это как реализовать? На ум приходят только две мысли:
1) Отлавливать все возможные исключения, связанные с интернетом
2) Создать сервис, который будет ежесекундно проверять соединение с интернетом
Или есть базовые слушатели какие?
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
09.06.2014, 20:17     Проверка интернет соединения #12
Sony17, есть ресивер - BroadcastReceiver c android.net.conn.CONNECTIVITY_CHANGE фильтром
mcGurov
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 99
09.06.2014, 21:54  [ТС]     Проверка интернет соединения #13
Цитата Сообщение от YuraAAA Посмотреть сообщение
BroadcastReceiver
Цитата Сообщение от Sony17 Посмотреть сообщение
А это как реализовать?
Вот нашёл - Как при запуске проверить включен ли обычный интернет?

Добавлено через 1 час 13 минут
YuraAAA, А где формировать условие? Условие никак не срабатывает...
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.webkit.WebView;
 
public class NewsActivity extends Activity {
    
    WebView mWebViewNews;
    WebView mWebViewStock;
    WebView mWebViewPrice;
    
    String News = "<html><body>Нет интернет соединения. \n </body></html>";
    String Stock = "<html><body>Проверьте ваше интернет подключение </body></html>";
    String Price = "<html><body>Проверьте ваше интернет подключение </body></html>";
    boolean status;
    
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news);
         
        mWebViewNews = (WebView) findViewById (R.id.webViewNews);
        mWebViewStock = (WebView) findViewById (R.id.webViewStock);
        mWebViewPrice = (WebView) findViewById (R.id.webViewPrice);
        
     // отображение данных если URL недоступен
        if (status = true) mWebViewNews.loadUrl("http://tpk-tek.ru/pda/index/news_mobile/0-21/");
        if (status = true)  mWebViewStock.loadUrl("http://tpk-tek.ru/pda/index/stock_mobile/0-22");
        if (status = true)  mWebViewPrice.loadUrl("http://tpk-tek.ru/pda/index/skachat_prajs/0-7");   
     
        // отображение данных если URL недоступен
        if (status = false) mWebViewNews.loadDataWithBaseURL(null, News, "text/html", "utf-8", null);
        if (status = false) mWebViewStock.loadDataWithBaseURL(null, Stock, "text/html", "utf-8", null);
        if (status = false) mWebViewPrice.loadDataWithBaseURL(null, Price, "text/html", "utf-8", null);
 
     
    }
        public boolean isOnline() {
            
            ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo nInfo = cm.getActiveNetworkInfo();
            if (nInfo != null && nInfo.isConnected()) {
                status = true;
                return true;
            }
            else {
                status = false;
                return false;
            }
            
            
        }
     
}
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
10.06.2014, 10:27     Проверка интернет соединения #14
Цитата Сообщение от mcGurov Посмотреть сообщение
// отображение данных если URL недоступен
перед этой строчкой надо добавить
Java
1
status = isOnline();
Вы же нигде не присваиваете этой переменной значение.
И ещё.
Java
1
if (status = true)
это неправильно.

В джаве сравнение происходит с помощью == или .equals.

В Вашем случае код должен быть таким:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.....
 
mWebViewPrice = (WebView) findViewById (R.id.webViewPrice);
 
     // отображение данных если URL недоступен
        if ( isOnline()) { 
            mWebViewNews.loadUrl("http://tpk-tek.ru/pda/index/news_mobile/0-21/");
            mWebViewStock.loadUrl("http://tpk-tek.ru/pda/index/stock_mobile/0-22");
            mWebViewPrice.loadUrl("http://tpk-tek.ru/pda/index/skachat_prajs/0-7"); 
       else {
           mWebViewNews.loadDataWithBaseURL(null, News, "text/html", "utf-8", null);
           mWebViewStock.loadDataWithBaseURL(null, Stock, "text/html", "utf-8", null);
           mWebViewPrice.loadDataWithBaseURL(null, Price, "text/html", "utf-8", null);
           }
mcGurov
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 99
10.06.2014, 14:06  [ТС]     Проверка интернет соединения #15
Всё получилось! СпасибоYuraAAA! Но проблема не решилась, при включенном wi-fi и отсутствии инета приложение теперь не вылетает, но и текст не отображается в WebView...

Вот пример работающего (частично) кода, кому-то может пригодится...
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package ru.teploenergokomplect;
 
 
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
 
public class NewsActivity extends Activity {
    
    WebView mWebViewNews;
    WebView mWebViewStock;
    WebView mWebViewPrice;
    
    String News = "<html><body>Нет интернет соединения. \n </body></html>";
    String Stock = "<html><body>Проверьте ваше интернет подключение </body></html>";
    String Price = "<html><body>Проверьте ваше интернет подключение </body></html>";
    
    boolean status;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news);
         
        mWebViewNews = (WebView) findViewById (R.id.webViewNews);
        mWebViewStock = (WebView) findViewById (R.id.webViewStock);
        mWebViewPrice = (WebView) findViewById (R.id.webViewPrice);
        
        if ( isOnline()) { 
        // переходим по URL если доступен
            mWebViewNews.loadUrl("http://tpk-tek.ru/pda/index/news_mobile/0-21/");
            mWebViewStock.loadUrl("http://tpk-tek.ru/pda/index/stock_mobile/0-22");
            mWebViewPrice.loadUrl("http://tpk-tek.ru/pda/index/skachat_prajs/0-7"); 
        }
       else {
           
           
           status = isOnline();
 
        // решаем проблеммы с кодировкой
           WebSettings settingsNews = mWebViewNews.getSettings();
           settingsNews.setDefaultTextEncodingName("utf-8");
       // выводим текст если URL не доступен
       mWebViewNews.loadDataWithBaseURL(null, News, "text/html", "utf-8", null);
       
       WebSettings settingsStock = mWebViewStock.getSettings();
       settingsStock.setDefaultTextEncodingName("utf-8");
           mWebViewStock.loadDataWithBaseURL(null, Stock, "text/html", "utf-8", null);
           
           WebSettings settingsPrice = mWebViewPrice.getSettings();
           settingsPrice.setDefaultTextEncodingName("utf-8");
           mWebViewPrice.loadDataWithBaseURL(null, Price, "text/html", "utf-8", null);
           }
        
        
     
}
        
      boolean isOnline() {
            
            ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo nInfo = cm.getActiveNetworkInfo();
            if (nInfo != null && nInfo.isConnected()) {
                status = true;
                return true;
            }
            else {
                status = false;
                return false;
            }
            
            
        }
    
        
      
}
DoomTrooper
2 / 2 / 1
Регистрация: 21.01.2015
Сообщений: 51
08.06.2015, 21:14     Проверка интернет соединения #16
Java
1
2
3
4
5
6
7
 boolean isOnline() {
            
            ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo nInfo = cm.getActiveNetworkInfo();
       return nInfo != null && nInfo.isConnected();
           
            }
такая проверка не подходит если например включен только wifi а интернет отсутствует как тогда быть ведь специального метода вроде нет я поискал в документации не нашел может подскажете как решить эту задачу?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2015, 21:42     Проверка интернет соединения
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
08.06.2015, 21:42     Проверка интернет соединения #17
Как правильно вставить AlertDialog, если нет интернета?
Yandex
Объявления
08.06.2015, 21:42     Проверка интернет соединения
Ответ Создать тему
Опции темы

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