Hier finden Sie die optimale Methode zur Überprüfung der Internetverbindung. Diese Methode führt eine Reihe von Überprüfungen durch: "Befindet sich das Telefon nicht im Flugzeugmodus, ist das Telefon mit einem Netzwerk verbunden usw.". Wenn alle Prüfungen den Wert "true" ergeben, wird die Methode dann eine Datei aus dem Internet herunterladen und prüfen, ob der Inhalt mit einem erwarteten Wert übereinstimmt.
Die Vorteile dieser Methode im Vergleich zu anderen Methoden, die einen Server anpingen, um die Internetverbindung zu prüfen, sind:
-
Die Android-Laufzeit variiert von Telefon zu Telefon - daher können Sie diese Befehle möglicherweise nicht immer ausführen, wie hier gezeigt: Warum funktioniert ping auf einigen Geräten und auf anderen nicht?
-
Das Anpingen eines Servers funktioniert nicht immer, da Anmeldeseiten/Umleitungen in WLAN-Netzen den falschen Eindruck einer Verbindung erwecken können.
Diese Antwort ist in Kotlin geschrieben und verwendet die Kraftstoff Bibliothek zum Herunterladen einer Datei aus dem Internet mit der Methode fetchUrlAsString
aber jede Bibliothek kann ersetzt werden, solange Sie sicherstellen, dass Ihre HTTP-Anfrage nicht zwischengespeichert wird. Denken Sie an showConnectionWarning()
y hideConnectionWarning()
als gleichwertig zu internet connection status = false
y internet connection status = true
beziehungsweise.
private val networkReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val activeNetworkInfo = (context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).activeNetworkInfo
if (activeNetworkInfo != null) {
if (activeNetworkInfo.isConnectedOrConnecting) {
//Launches a coroutine to fetch file asynchronously
launch {
try {
//Downloads file from url on the internet - use any library you want here.
val connectionStatus = fetchUrlAsString(<url_for_file_on_internet>)
//check if the contents of the file is as expected
if (connectionStatus == "Connected To Database") {
hideConnectionWarning()
} else {
showConnectionWarning()
}
} catch (e: Exception) {
//Catches an exception - fetchUrlAsString only throws an exception if there is no internet
showConnectionWarning()
}
}
} else {
showConnectionWarning()
}
} else {
showConnectionWarning()
}
}
}
private suspend fun fetchUrlAsString(url: String): String = suspendCoroutine { cont ->
url.httpGet().header(Pair("pragma", "no-cache"), Pair("cache-control", "no-cache")).responseString { _, _, result ->
when (result) {
is Result.Failure -> {
cont.resumeWithException(result.getException())
}
is Result.Success -> {
cont.resume(result.value)
}
}
}
}
Sie benötigen die folgenden Berechtigungen:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
7 Stimmen
Um zu prüfen, ob eine Internetverbindung besteht, ist es wahrscheinlich am zuverlässigsten, einen der großen Nameserver anzupingen, z. B. mit
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. Siehe meine Antwort für eine schönere Implementierung dieser Funktion. Btw die akzeptierte Antwort (und viele andere hier) einfach nach einem Netzanschluss und nicht das Internet.0 Stimmen
Siehe-> stackoverflow.com/a/4239019/1815624
4 Stimmen
Verwenden Sie nicht die Ping-Methode, sondern eine HTTP-Überprüfung. ICMP wird in einigen Netzen blockiert, so dass Ping nicht funktioniert. Beispiel: Bei mir zu Hause funktioniert es einwandfrei, aber nicht, wenn ich mobile Daten im Netz von Vodafone (in Ungarn) verwende. Sie können die beiden Methoden auch kombinieren, aber seien Sie vorsichtig, denn waitFor() wartet etwa 20 Sekunden, auch wenn -w oder -W verwendet wird.
0 Stimmen
getAllNetworkInfo()
ist in API Stufe 29 veraltet