Існує більше ніж один спосіб
По-перше, найкоротший, але неефективний шлях
Потрібно лише дозвіл на стан мережі
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Тоді цей метод,
public boolean activeNetwork () {
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnected();
return isConnected;
}
Як видно з відповідей ConnectivityManager
- це рішення, я тільки що додав його в метод, це спрощений метод всієї експлуатації
ConnectivityManager
повертає істину, якщо є мережевий доступ, а не доступ до Інтернету, тобто якщо ваш WiFi підключений до роутера, але у маршрутизатора немає Інтернету повертає вірно, перевіряє наявність з'єднання
По-друге, ефективний спосіб
Потрібні дозволи мережі та Інтернет
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
Тоді цей клас,
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
}
}
}
Дзвінок CheckInternetAsyncTask
new CheckInternetAsyncTask(getApplicationContext()).execute();
Деякі пояснення: -
вам потрібно перевірити Інтернет AsyncTask
, інакше він може кинутись android.os.NetworkOnMainThreadException
у деяких випадках
ConnectivityManager
використовується для перевірки доступу до мережі, якщо істина надсилає запит (Ping)
Запит на надсилання http://clients3.google.com/generate_204
: Ця відома URL-адреса, як відомо, повертає порожню сторінку зі статусом HTTP 204, це швидше і ефективніше, ніж http://www.google.com
прочитайте це . якщо у вас є веб-сайт, його краще розміщувати замість google, лише якщо ви використовуєте його в додатку
Час очікування може бути змінено (20 мс -> 2000 мс), зазвичай використовується 1500 мс
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. Дивіться мою відповідь щодо кращого втілення цього. Тим не менш, прийняту відповідь (та багато інших тут) просто перевірте на підключення до мережі , а не на Інтернет.