Есть более чем один способ
Первый, самый короткий, но неэффективный способ
Требуется только состояние сети
<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 мс