Es gibt mehr als einen Weg
Erster, kürzester, aber ineffizienter Weg
Netzwerkstatus Erlaubnis nur erforderlich
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Dann diese Methode,
public boolean activeNetwork () {
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnected();
return isConnected;
}
Wie in den Antworten zu sehen ConnectivityManager
ist eine Lösung, ich habe sie einfach in eine Methode eingefügt, diese ist eine vereinfachte Methode, die alle verwenden
ConnectivityManager
gibt true zurück, wenn es einen Netzwerkzugang, aber keinen Internetzugang gibt, d.h. wenn Ihr WiFi mit einem Router verbunden ist, der Router aber kein Internet hat, gibt es true zurück, es prüft die Verfügbarkeit der Verbindung
Zweitens: Effizienter Weg
Netzwerkstatus und Internet-Zugang erforderlich
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
Dann diese Klasse,
public class CheckInternetAsyncTask extends AsyncTask<Void, Integer, Boolean> {
private Context context;
public CheckInternetAsyncTask(Context context) {
this.context = context;
}
@Override
protected Boolean doInBackground(Void... params) {
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
assert cm != null;
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnected();
if (isConnected) {
try {
HttpURLConnection urlc = (HttpURLConnection)
(new URL("http://clients3.google.com/generate_204")
.openConnection());
urlc.setRequestProperty("User-Agent", "Android");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1500);
urlc.connect();
if (urlc.getResponseCode() == 204 &&
urlc.getContentLength() == 0)
return true;
} catch (IOException e) {
Log.e("TAG", "Error checking internet connection", e);
return false;
}
} else {
Log.d("TAG", "No network available!");
return false;
}
return null;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
Log.d("TAG", "result" + result);
if(result){
// do ur code
}
}
}
Rufen Sie an. CheckInternetAsyncTask
new CheckInternetAsyncTask(getApplicationContext()).execute();
Einige Erklärungen :-
-
müssen Sie das Internet unter AsyncTask
, sonst kann es android.os.NetworkOnMainThreadException
in einigen Fällen
-
ConnectivityManager
verwendet, um den Netzzugang zu prüfen, wenn true eine Anfrage sendet (Ping)
-
Anfrage senden an http://clients3.google.com/generate_204
Diese bekannte URL ist dafür bekannt, dass sie eine leere Seite mit einem HTTP-Status 204 zurückgibt, was schneller und effizienter ist als http://www.google.com
, lesen diese . wenn Sie eine Website haben, ist es besser, Ihre Website anstelle von Google anzugeben, aber nur, wenn Sie sie in der App verwenden
-
Timeout kann in einem Bereich von 20ms bis 2000ms eingestellt werden, 1500ms wird üblicherweise verwendet.
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