Как программно проверить наличие интернет-соединения в Android?
Я хочу проверить программно, есть ли интернет-соединение в Android-телефоне/эмуляторе. Поэтому, когда я уверен, что есть интернет-соединение, я позвоню в Интернет.
Итак, это похоже на "Эй эмулятор! Если у вас есть интернет-соединение, то, пожалуйста, откройте эту страницу, иначе doSomeThingElse();"
Ответы
Ответ 1
Метод, который я реализовал для себя:
/*
* isOnline - Check if there is a NetworkConnection
* @return boolean
*/
protected boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
return true;
} else {
return false;
}
}
Помните, что это NetworkConnection-Check. Если есть NetworkConnection, он не должен быть InternetConnection.
Ответ 2
Подключение к сети не гарантирует подключение к Интернету.
Возможно, вы подключились к домашнему Wi-Fi, но у вас может не быть интернет-соединения.
Или вы можете быть в ресторане, где вы можете подключиться к Wi-Fi, но для доступа к Интернету все равно нужен пароль для горячей точки. В таких случаях вышеуказанные методы вернут true, но у устройства не будет интернета, и если он не будет окружен правильной попыткой и уловом, приложение может потерпеть крах.
Нижняя линия, сетевое подключение, не означает подключение к Интернету, это просто означает, что беспроводное оборудование вашего устройства может подключаться к другому хосту, и оба могут установить соединение.
Ниже приведен метод, который может проверить, может ли устройство подключаться к веб-сайту и соответственно возвращает ответ.
if (networkConnectivity())
{
try
{
HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.anywebsiteyouthinkwillnotbedown.com").openConnection());
urlc.setRequestProperty("User-Agent", "Test");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(3000); //choose your own timeframe
urlc.setReadTimeout(4000); //choose your own timeframe
urlc.connect();
networkcode2 = urlc.getResponseCode();
return (urlc.getResponseCode() == 200);
} catch (IOException e)
{
return (false); //connectivity exists, but no internet.
}
} else
{
return false; //no connectivity
}
Ответ 3
как для заголовка вопроса, вы хотите проверить доступ в Интернет,
поэтому самый быстрый способ и он эффективен хотя бы на данный момент,
thnx to levit на основе его ответа fooobar.com/questions/13922/...
Если вы просто хотите проверить подключение к любой сети - не заботиться если интернет доступен - тогда большинство ответов здесь (в том числе принятый), реализация isConnectedOrConnecting() будет работать хорошо. Если вы хотите узнать, есть ли у вас подключение к Интернету (как название вопроса указывает), пожалуйста, прочитайте на Ping для основного имени Серверы
public boolean isOnline() {
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
int exitValue = ipProcess.waitFor();
return (exitValue == 0);
} catch (IOException e) { e.printStackTrace(); }
catch (InterruptedException e) { e.printStackTrace(); }
return false; }
Что это! Да, это коротко, да, это быстро, не нужно бегать в фоновом режиме, вам не нужны привилегии root.
Возможные вопросы
Это действительно достаточно быстро?
Да, очень быстро!
На самом деле нет надежного способа проверить доступность Интернета, кроме тестирования чего-то в Интернете?
Не знаю, насколько я знаю, но дайте мне знать, и я отредактирую свой ответ.
Не могу ли я просто пинговать свою собственную страницу, которую я хочу запросить в любом случае?
Конечно! Вы даже можете проверить оба варианта, если вы хотите различать "доступ к интернету" и ваши собственные серверы доступны [/p >
Что делать, если DNS не работает?
Google DNS (например, 8.8.8.8) является самой большой публичной службой DNS в Мир. По состоянию на 2013 год он обслуживает 130 миллиардов запросов в день. Позвольте просто скажем, ваше приложение не отвечает, вероятно, не будет разговором о день.
Какие разрешения необходимы?
Просто доступ в Интернет - какой сюрприз ^^ (Кстати, вы когда-нибудь задумывались, как некоторые из предложенных здесь методов могут даже иметь удаленный клей о доступности интернета, без этого разрешения?)
Ответ 4
Я использовал эти два метода для проверки состояния Интернета
иногда протокол https не работает. Попробуйте http протокол
// Check if network is available
public static boolean isNetworkAvailable() {
ConnectivityManager cm = (ConnectivityManager)
AppGlobals.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
}
// ping the google server to check if internet is really working or not
public static boolean isInternetWorking() {
boolean success = false;
try {
URL url = new URL("https://google.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(10000);
connection.connect();
success = connection.getResponseCode() == 200;
} catch (IOException e) {
e.printStackTrace();
}
return success;
}
Ответ 5
Попробуйте следующее:
ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING ) {
text.setText("hey your online!!!") ;
//Do something in here when we are connected
} else if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED ) {
text.setText("Look your not online");
}
Ответ 6
Поскольку вы подключены к сети, не гарантируйте, что у вас есть Интернет, я перешел к простому звонку в Интернет внутри блока catch try. Затем поймайте UnknownHostException, чтобы не обрабатывать Интернет.
Ответ 7
Из моего OLD Ответ здесь
Просто попробуйте это
Я применил решение, предоставленное @Levit, и создал функцию, которая не будет вызывать дополнительный запрос Http.
Он разрешит ошибку Unable to Resolve Host
public static boolean isInternetAvailable(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork == null) return false;
switch (activeNetwork.getType()) {
case ConnectivityManager.TYPE_WIFI:
if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
isInternet())
return true;
break;
case ConnectivityManager.TYPE_MOBILE:
if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
isInternet())
return true;
break;
default:
return false;
}
return false;
}
private static boolean isInternet() {
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
int exitValue = ipProcess.waitFor();
Debug.i(exitValue + "");
return (exitValue == 0);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return false;
}
Теперь назовите это,
if (!isInternetAvailable(getActivity())) {
//Show message
} else {
//Perfoem the api request
}