Ты прав. Предоставленный вами код проверяет только наличие сетевого подключения. Лучший способ проверить, есть ли активное подключение к Интернету, - это попытаться подключиться к известному серверу через http.
public static boolean hasActiveInternetConnection(Context context) {
if (isNetworkAvailable(context)) {
try {
HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
urlc.setRequestProperty("User-Agent", "Test");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1500);
urlc.connect();
return (urlc.getResponseCode() == 200);
} catch (IOException e) {
Log.e(LOG_TAG, "Error checking internet connection", e);
}
} else {
Log.d(LOG_TAG, "No network available!");
}
return false;
}
Конечно, вы можете заменить http://www.google.com
URL-адрес любым другим сервером, к которому хотите подключиться, или сервером, который, как вы знаете, имеет хорошее время безотказной работы.
Как Тони Чо также указал в этом комментарии ниже , убедитесь, что вы не запускаете этот код в основном потоке, иначе вы получите исключение NetworkOnMainThread (в Android 3.0 или новее). Вместо этого используйте AsyncTask или Runnable.
Если вы хотите использовать google.com, вам следует взглянуть на модификацию Jeshurun. В своем ответе он изменил мой код и сделал его более эффективным. Если вы подключитесь к
HttpURLConnection urlc = (HttpURLConnection)
(new URL("http://clients3.google.com/generate_204")
.openConnection())
а затем проверьте код ответа на 204
return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0)
тогда вам не нужно сначала загружать всю домашнюю страницу Google.