Проверка наличия интернет соединения

Ответить
ArseniySafin
Сообщения: 22
Зарегистрирован: 26 ноя 2013, 22:12

Проверка наличия интернет соединения

Сообщение ArseniySafin » 26 ноя 2013, 22:30

Всем привет!
Здесь затрагивался вопрос, который я хочу вам задать:
viewtopic.php?f=41&t=1625
Если коротко, там спрашивалось о проверке работоспособности интернет соединения и автор вопроса решил, что он закончил свои изыскания, хотя он остановился на том же, что и я, вообще говоря на том же, на чём остановилось несколько других людей задающие этот вопрос в интернете по всему миру, более того, он единственный кого я видел, кто заметил следующую проблему:
Итак,

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

    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;}
Существует ещё пара тройка реализацией этой задачи, но почти все они выдают true или false в зависимости от того подключен к интернету или нет, проблема в том, что устройство подключенное к нерабочему wi-fi будет выдавать true, однако доступа на деле не будет, причём программа поймёт это далеко не сразу, может вообще не поймёт даже.

Все мы знаем о варианте: попробовать сделать запрос к любому url и если не получится, то интернета нет, но то как я это реализовал давал ответ недостаточно быстро, и мне пришлось от него отказаться.
Возможно, вы расскажете мне как это сделать быстро или поделитесь опытом решения этой задачи. Я буду даже рад, если кто-нибудь расскажет как выделить этот вариант, чтобы я мог объявить тост: "неполадки соединения!".

Заранее спасибо.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Проверка наличия интернет соединения

Сообщение trew » 26 ноя 2013, 22:46

Так реализовывали?
[syntax=java]private static boolean checkInternetConnection() {
Boolean result = false;
HttpURLConnection con = null;
try {
// HttpURLConnection.setFollowRedirects(false);
// HttpURLConnection.setInstanceFollowRedirects(false)
con = (HttpURLConnection) new URL("http://www.ya.ru").openConnection();
con.setRequestMethod("HEAD");
result = (con.getResponseCode() == HttpURLConnection.HTTP_OK);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (con != null) {
try {
con.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return result;
}[/syntax]
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

ArseniySafin
Сообщения: 22
Зарегистрирован: 26 ноя 2013, 22:12

Сообщение ArseniySafin » 26 ноя 2013, 23:02

Реализовывал, этот код выдаёт false, даже тогда когда код, который привёл я выдаёт true.

ArseniySafin
Сообщения: 22
Зарегистрирован: 26 ноя 2013, 22:12

Re: Проверка наличия интернет соединения

Сообщение ArseniySafin » 26 ноя 2013, 23:43

Всегда false из-за этого:

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

11-26 20:15:36.095: W/System.err(500): java.io.EOFException
11-26 20:15:36.111: W/System.err(500): 	at java.util.zip.GZIPInputStream.readFully(GZIPInputStream.java:214)
11-26 20:15:36.115: W/System.err(500): 	at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
11-26 20:15:36.115: W/System.err(500): 	at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:64)
11-26 20:15:36.115: W/System.err(500): 	at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.initContentStream(HttpURLConnectionImpl.java:539)
11-26 20:15:36.115: W/System.err(500): 	at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1046)
11-26 20:15:36.115: W/System.err(500): 	at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:726)
11-26 20:15:36.115: W/System.err(500): 	at ru.startandroid.develop.viewbyid.MainActivity.checkInternetConnection(MainActivity.java:242)
11-26 20:15:36.125: W/System.err(500): 	at ru.startandroid.develop.viewbyid.MainActivity.onCreate(MainActivity.java:94)
11-26 20:15:36.139: W/System.err(500): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-26 20:15:36.139: W/System.err(500): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
11-26 20:15:36.145: W/System.err(500): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
11-26 20:15:36.145: W/System.err(500): 	at android.app.ActivityThread.access$1500(ActivityThread.java:117)
11-26 20:15:36.145: W/System.err(500): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
11-26 20:15:36.145: W/System.err(500): 	at android.os.Handler.dispatchMessage(Handler.java:99)
11-26 20:15:36.145: W/System.err(500): 	at android.os.Looper.loop(Looper.java:123)
11-26 20:15:36.145: W/System.err(500): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
11-26 20:15:36.145: W/System.err(500): 	at java.lang.reflect.Method.invokeNative(Native Method)
11-26 20:15:36.145: W/System.err(500): 	at java.lang.reflect.Method.invoke(Method.java:507)
11-26 20:15:36.170: W/System.err(500): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-26 20:15:36.170: W/System.err(500): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-26 20:15:36.170: W/System.err(500): 	at dalvik.system.NativeStart.main(Native Method)
Попробовал сайт попроще, а не яндекс, на эмуляторе стал выдавать true, если интернет есть. На тестируемом устройстве всегда false (вероятно всё тот же EOFException - добавил обработку EOFException, эмулятор стал выдавать тру при запросе в яндекс, но телефон всё также false, значит на телефоне не EOFException, бардак какой-то).

В любом случае думает очень долго, если подключено к неработающему wi-fi.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Проверка наличия интернет соединения

Сообщение trew » 27 ноя 2013, 13:37

Брал код с этого сайта. Но не проверял его.

У меня возникла идея: когда интернет есть - ответ получаем быстро, а когда нет - ждём ответа.
Вот и попытался реализовать её:
[syntax=java]import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {

final static String TAG ="mylog";
Thread t2, t3;
int existInternet =0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Log.d(TAG, "---- start---------");

t2 = new Thread(new Runnable() {
public void run() {
checkConnectivity("http://www.ya.ru");
}
});

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); // на ошибку можно не обращать внимание
}
}}[/syntax]
Права в файле манифеста:
[syntax=xml]<uses-permission android:name="android.permission.INTERNET" />[/syntax]

Примеры из интернета: ссылка1, ссылка2, ссылка3.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

ArseniySafin
Сообщения: 22
Зарегистрирован: 26 ноя 2013, 22:12

Re: Проверка наличия интернет соединения

Сообщение ArseniySafin » 28 ноя 2013, 17:05

Отличная идея, спасибо за такую оперативную помощь, но надо всё-таки изменить чуть-чуть:

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

if (existInternet!=1  && isNetworkAvailable()) {try {t3.join(); // ожидание завершения потока t3
    } 
    catch (InterruptedException e) {e.printStackTrace();}}
Чтобы при наличии работающего интернета или его отсутствии не приходилось ждать установленное время.

Остаётся 1 вопрос, какой лучше выбрать сайт:

Потому как эмулятор при моём интернете за секунду 1 раз из 5 не успевал получить ответ от яндекса.
Попробовал попроще адрес, с ним все тесты программа прошла даже на эмуляторе.
Сайт находим с наименьшим контентом ответа, к примеру time-a.timefreq.bldrdoc.gov по 13 порту. Он возвращает точное время по атомным часам.
Может вы понимаете как этим воспользоваться?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Проверка наличия интернет соединения

Сообщение KamiSempai » 28 ноя 2013, 17:21

По мне, так проблема высосана из пальца. Фактически, знать то, что интернет не подключен нужно лишь для того, что бы сказать об этом пользователю. Мало того, способ описанный в шапке иногда выдает ложные срабатывания.

Я делал по простому. Конектился к своему серверу без каких либо проверок и если подключиться не удавалось начинал выяснять почему. Если срабатывала проверка из шапки, говорил, включите интернет, иначе писал, что не удалось подключиться к серверу.

PS:Идеального способа нет. Может быть так, что интернет на самом деле есть, но фаервор рубит все подряд, что не из белого списка.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

ArseniySafin
Сообщения: 22
Зарегистрирован: 26 ноя 2013, 22:12

Re: Проверка наличия интернет соединения

Сообщение ArseniySafin » 28 ноя 2013, 18:00

Вы правы, чаще всего не описать этот случай означает просто оставить маленькую дырочку, но бывают и случаи, когда это серьёзная проблема, которая требует внимания.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Проверка наличия интернет соединения

Сообщение KamiSempai » 28 ноя 2013, 18:19

Разве мой пример оставляет что-то без внимания?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

ArseniySafin
Сообщения: 22
Зарегистрирован: 26 ноя 2013, 22:12

Re: Проверка наличия интернет соединения

Сообщение ArseniySafin » 28 ноя 2013, 21:47

Разве мой пример оставляет что-то без внимания?
Я думаю, вы опытный разработчик, и у вас всё работает.
Мало того, способ описанный в шапке иногда выдает ложные срабатывания.
Вы разобрались в каких случаях?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Проверка наличия интернет соединения

Сообщение KamiSempai » 28 ноя 2013, 22:00

ArseniySafin писал(а):
Мало того, способ описанный в шапке иногда выдает ложные срабатывания.
Вы разобрались в каких случаях?
Нет, так как не смог воспроизвести.
Однако, были жалобы пользователей на то, что интернет у них есть, а игра выводит сообщение об отсутствии интернета. По этому сделал так как описывал ранее.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить