Netzwerkverbindung / Internetzugang
isConnectedOrConnecting()
Kontrollen für alle (in den meisten Antworten verwendet) Netzwerk - Verbindung
- Verwenden Sie eine der folgenden Methoden, um festzustellen, ob eines dieser Netzwerke über einen Internetzugang verfügt
A) Pingen Sie einen Server (einfach)
// 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;
}
+
könnte auf Haupt-Thread laufen
-
funktioniert auf einigen alten Geräten (Galays S3 usw.) nicht, blockiert eine Weile, wenn kein Internet verfügbar ist.
B) Stellen Sie eine Verbindung zu einer Steckdose im Internet her (erweitert)
// 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; }
}
+
sehr schnell (so oder so), funktioniert auf allen Geräten, sehr zuverlässig
-
kann nicht auf dem UI-Thread ausgeführt werden
Dies funktioniert auf jedem Gerät sehr zuverlässig und ist sehr schnell. Es muss jedoch in einer separaten Aufgabe ausgeführt werden (z . B. ScheduledExecutorService
oder AsyncTask
).
Mögliche Fragen
Ist es wirklich schnell genug?
Ja sehr schnell ;-)
Gibt es keine zuverlässige Möglichkeit, das Internet zu überprüfen, außer etwas im Internet zu testen?
Nicht so weit ich weiß, aber lass es mich wissen, und ich werde meine Antwort bearbeiten.
Was ist, wenn der DNS ausgefallen ist?
Google DNS (z. B. 8.8.8.8
) ist das größte öffentliche DNS der Welt. Ab 2013 wurden täglich 130 Milliarden Anfragen bearbeitet. Sagen wir einfach, Ihre App wäre wahrscheinlich nicht das Tagesgespräch.
Welche Berechtigungen sind erforderlich?
<uses-permission android:name="android.permission.INTERNET" />
Nur Internetzugang - Überraschung ^^ (Übrigens haben Sie jemals darüber nachgedacht, wie einige der hier vorgeschlagenen Methoden ohne diese Erlaubnis sogar einen Fernkleber über den Internetzugang haben könnten?)
Extra: One-Shot- AsyncTask
Beispiel
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 */ });
Extra: One-Shot- RxJava/RxAndroid
Beispiel (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 */}
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. Siehe meine Antwort für eine schönere Implementierung davon. Bei der akzeptierten Antwort (und vielen anderen hier) wird nur nach einer Netzwerkverbindung gesucht , nicht nach dem Internet.