Подключение андроид интернет проверить лучше способ
согласно сайту разработчика Android,определение и мониторинг состояния подключения, мы можем проверить есть активное подключение к интернету. Но это не работает, если даже подключен только Wi-Fi и не доступен Интернет (он уведомляет о наличии подключения к интернету).
теперь я пингую веб-сайт и проверяю, доступны ли интернет-соединения или нет. И этот метод требует больше времени обработки. Есть ли лучший метод для проверка подключения к Интернету, чем это, чтобы избежать временной задержки в ping адрес?
9 ответов
попробуйте это:
это очень просто и быстро:
public boolean isInternetAvailable(String address, int port, int timeoutMs) {
try {
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress(address, port);
sock.connect(sockaddr, timeoutMs); // This will block no more than timeoutMs
sock.close();
return true;
} catch (IOException e) { return false; }
}
тогда везде, где вы хотите проверить, просто используйте это:
if (isInternetAvailable("8.8.8.8", 53, 1000)) {
// Internet available, do something
} else {
// Internet not available
}
попробуйте следующее:
public boolean checkOnlineState() {
ConnectivityManager CManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo NInfo = CManager.getActiveNetworkInfo();
if (NInfo != null && NInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
не забудьте доступ:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
другое:
if (InetAddress.getByName("www.google.com").isReachable(timeout))
{ }
else
{ }
первая проблема, которую вы должны прояснить, - это то, что вы подразумеваете под whether internet is available
?
- не подключен к wifi или сотовой сети;
- подключен к ограниченному wifi: например, в школьной сети, Если вы подключаетесь к школе wifi, вы можете получить доступ к интрасети напрямую. Но вы должны войти в систему с учетной записи, доступ к экстрасети. В этом случае, если вы ping веб-сайт Экстранет, вы можете получить ответ, потому что некоторые интрасети сделали автоматическое перенаправление для входа в систему страница;
- подключен к неограниченному wifi: вы можете получить доступ к большинству веб-сайтов;
вторая проблема заключается в том, чего вы хотите достичь?
насколько я понимаю ваше описание, вы, кажется, хотите проверить подключение к сети и напомнить пользователю, если он терпит неудачу. Поэтому я рекомендую вам просто пинг сервера, что всегда хорошо, если вы хотите обмениваться данными с ним.
вы задаетесь вопросом, есть ли лучший способ проверить связь, и ответ-нет.
текущая сеть TCP / IP-это виртуальная схема с коммутацией пакетов сеть, что означает, что нет фиксированного "пути" для запуска данных, т. е. не как телефон, у нас есть реальная связь между двумя пользователями, мы можем знать, что соединение теряется сразу после разрыва цепи. Мы должны отправить пакет в пункт назначения и не найти ответа, тогда мы знаем, что теряем соединение (что и делает протокол ping-ICMP).
В заключение, у нас нет лучшего способа проверить подключение к хосту, кроме ping it, вот почему пульс используется в управлении сервисом.
при проверке этой проблемы выяснилось, что мы не можем определить, есть ли активное подключение к интернету, используя метод, указанный на сайте разработчика: https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html
это будет проверять только whther Ther активное соединение wifi.
поэтому я нашел 2 метода, которые проверят, есть ли активное подключение к интернету
1.Ping веб-сайт с помощью ниже метод
URL url = new URL(myUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
// 30 second time out.
httpURLConnection.setConnectTimeout(30000);
httpURLConnection.connect();
if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
isAvailable = true;
}
2.Проверьте наличие Google DNS с помощью сокета
try {
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);
sock.connect(sockaddr, 1000); // this will block no more than timeoutMs
sock.close();
return true;
}
второй метод немного быстрее, чем 2-й метод (который подходит для моего требования)
спасибо всем за ответы и поддержку.
ConnectivityManager не сможет сообщить вам, есть ли у вас активное соединение по WIFI.
Единственный вариант проверить, если у нас есть активное подключение к Интернету, чтобы пинговать URL. Но вам не нужно делать это с каждым HTTP-запросом, который вы сделали из своего приложения.
Что вы можете сделать:
-
используйте ниже код для проверки подключения
private boolean checkInternetConnection() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // test for connection if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isAvailable() && cm.getActiveNetworkInfo().isConnected()) { return true; } else { return false; } }
и при выполнении вызова rest с использованием тайм-аута HTTP-клиента, например 10 секунд. Если вы не получите ответ в течение 10 секунд, значит, у вас нет активного подключения к интернету, и будет выдано исключение (в основном вы получите ответ в течение 10 секунд). Нет необходимости проверять активное соединение, пингуя каждый раз (если вы не делаете чат или VOIP приложение)
возможно, это может вам помочь:
private boolean checkInternetConnection() {
ConnectivityManager cm = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
// Test for connection
if (cm.getActiveNetworkInfo() != null
&& cm.getActiveNetworkInfo().isAvailable()
&& cm.getActiveNetworkInfo().isConnected()) {
return true;
}
else {
return false;
}
}
попробовать этот метод, это поможет вам:
public static boolean isNetworkConnected(Context context)
{
ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null)
{
NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected())
{
return true;
}
}
return false;
}
вы можете попробовать это для проверки подключения к интернету:
/**
* Check Connectivity of network.
*/
public static boolean isOnline(Context context) {
try {
if (context == null)
return false;
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm != null) {
if (cm.getActiveNetworkInfo() != null) {
return cm.getActiveNetworkInfo().isConnected();
} else {
return false;
}
} else {
return false;
}
}
catch (Exception e) {
Log.error("Exception", e);
return false;
}
}
в своей деятельности вы называете эту функцию так.
if(YourClass.isOnline(context))
{
// Do your stuff here.
}
else
{
// Show alert, no Internet connection.
}
Не забудьте добавить ACCESS_NETWORK_STATE разрешение:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
попробуйте это, если вы хотите просто ping URL:
public static boolean isPingAvailable(String myUrl) {
boolean isAvailable = false;
try {
URL url = new URL(myUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
// 30 second time out.
httpURLConnection.setConnectTimeout(30000);
httpURLConnection.connect();
if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
isAvailable = true;
}
} catch (Exception e) {
isAvailable = false;
e.printStackTrace();
}
return isAvailable;
}
Я хотел прокомментировать, но недостаточно репутации:/
в любом случае, проблема с принятым ответом-это не поймать SocketTimeoutException, которое я видел в дикой природе (Android), которое вызывает сбои.
public boolean isInternetAvailable(String address, int port, int timeoutMs) {
try {
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress(address, port);
sock.connect(sockaddr, timeoutMs); // This will block no more than timeoutMs
sock.close();
return true;
} catch (IOException e) {
return false;
} catch (SocketTimeoutException e) {
return false;
}
}