Там больше, чем один способ
Во-первых, самый короткий, но неэффективный способ
Требуется только разрешение состояния сети
<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
возвращает значение true, если есть доступ к сети, а не доступ к Интернету, то есть если ваш WiFi подключен к маршрутизатору, но у маршрутизатора нет Интернета, то это возвращает true, проверяет наличие соединения
Во-вторых, эффективный способ
Состояние сети и интернет-разрешения необходимы
<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
используется для проверки доступа к сети, если true отправляет запрос (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) ...
. Смотрите мой ответ для более хорошей реализации этого. Кстати, принятый ответ (и многие другие здесь) просто проверьте подключение к сети , а не к Интернету.