Сетевое подключение / доступ в интернет
isConnectedOrConnecting()
(используется в большинстве ответов) проверяет любую сеть соединение
- Чтобы узнать, имеет ли какая-либо из этих сетей доступ Интернет , используйте одну из следующих
A) Проверка связи с сервером (просто)
// ICMP
public boolean isOnline() {
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
int exitValue = ipProcess.waitFor();
return (exitValue == 0);
}
catch (IOException e) { e.printStackTrace(); }
catch (InterruptedException e) { e.printStackTrace(); }
return false;
}
+
может работать в главном потоке
-
не работает на некоторых старых устройствах (Galays S3 и т. Д.), Он блокируется некоторое время, если нет доступа в Интернет.
B) Подключение к сокету в Интернете (дополнительно)
// TCP/HTTP/DNS (depending on the port, 53=DNS, 80=HTTP, etc.)
public boolean isOnline() {
try {
int timeoutMs = 1500;
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);
sock.connect(sockaddr, timeoutMs);
sock.close();
return true;
} catch (IOException e) { return false; }
}
+
очень быстро (в любом случае), работает на всех устройствах, очень надежно
-
не может работать в потоке пользовательского интерфейса
Это работает очень надежно на каждом устройстве и очень быстро. Он должен выполняться в отдельной задаче (например, ScheduledExecutorService
или AsyncTask
).
Возможные вопросы
Это действительно достаточно быстро?
Да, очень быстро; -)
Нет ли надежного способа проверить интернет, кроме тестирования чего-либо в интернете?
Не настолько, насколько я знаю, но дайте мне знать, и я отредактирую свой ответ.
Что, если DNS не работает?
Google DNS (например, 8.8.8.8
) является крупнейшим общедоступным DNS в мире. По состоянию на 2013 год он обслуживал 130 миллиардов запросов в день. Скажем так, ваше приложение, вероятно, не будет сегодняшним разговором.
Какие разрешения требуются?
<uses-permission android:name="android.permission.INTERNET" />
Просто доступ к Интернету - сюрприз ^^ (Кстати, вы когда-нибудь задумывались над тем, как некоторые из предложенных здесь способов могли бы иметь хоть какое-то удаленное представление о доступе в интернет без этого разрешения?)
Дополнительно: один выстрел AsyncTask
Пример
class InternetCheck extends AsyncTask<Void,Void,Boolean> {
private Consumer mConsumer;
public interface Consumer { void accept(Boolean internet); }
public InternetCheck(Consumer consumer) { mConsumer = consumer; execute(); }
@Override protected Boolean doInBackground(Void... voids) { try {
Socket sock = new Socket();
sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
sock.close();
return true;
} catch (IOException e) { return false; } }
@Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }
}
///////////////////////////////////////////////////////////////////////////////////
// Usage
new InternetCheck(internet -> { /* do something with boolean response */ });
Дополнительно: один выстрел RxJava/RxAndroid
Пример (Kotlin)
fun hasInternetConnection(): Single<Boolean> {
return Single.fromCallable {
try {
// Connect to Google DNS to check for connection
val timeoutMs = 1500
val socket = Socket()
val socketAddress = InetSocketAddress("8.8.8.8", 53)
socket.connect(socketAddress, timeoutMs)
socket.close()
true
} catch (e: IOException) {
false
}
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
///////////////////////////////////////////////////////////////////////////////////
// Usage
hasInternetConnection().subscribe { hasInternet -> /* do something */}