Jest więcej niż jeden sposób
Po pierwsze, najkrótszy, ale nieefektywny sposób
Potrzebne jest tylko zezwolenie stanu sieci
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Następnie ta metoda
public boolean activeNetwork () {
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnected();
return isConnected;
}
Jak widać w odpowiedziach ConnectivityManager
jest to rozwiązanie, właśnie dodałem je w ramach metody, której wszyscy używają
ConnectivityManager
zwracają wartość true, jeśli istnieje dostęp do sieci, a nie dostęp do Internetu, oznacza to, że Wi-Fi jest podłączone do routera, ale router nie ma Internetu zwraca true, sprawdza dostępność połączenia
Po drugie, skuteczny sposób
Potrzebne są uprawnienia do stanu sieci i Internetu
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
Następnie ta klasa
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
}
}
}
Połączenie CheckInternetAsyncTask
new CheckInternetAsyncTask(getApplicationContext()).execute();
Niektóre objaśnienia: -
trzeba sprawdzić Internetu na AsyncTask
, w przeciwnym razie może on rzucać android.os.NetworkOnMainThreadException
w niektórych przypadkach
ConnectivityManager
służy do sprawdzania dostępu do sieci, jeśli true wysyła żądanie (Ping)
Żądanie wysłania na http://clients3.google.com/generate_204
ten znany adres URL zwraca pustą stronę o statusie HTTP 204, jest to szybsze i bardziej wydajne niż http://www.google.com
, przeczytaj to . jeśli masz witrynę, najlepiej jest umieścić ją zamiast Google, tylko jeśli korzystasz z niej w aplikacji
Limit czasu można zmienić w zakresie (20ms -> 2000ms), zwykle 1500ms
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. Zobacz moją odpowiedź na lepszą implementację tego. Przy okazji zaakceptowanej odpowiedzi (i wielu innych tutaj) po prostu sprawdź połączenie sieciowe , a nie Internet.