Android-подключение к Интернету проверяет лучший способ
В соответствии с сайтом разработчика Android Определение и мониторинг состояния подключения, мы можем проверить наличие активного подключения к Интернету. Но это не работает, если подключен только Wi-Fi, а не Интернет (он уведомляет о подключении к Интернету).
Теперь я пингует сайт и проверяю, доступны ли интернет-соединения или нет. И этот метод требует еще большего времени обработки. Есть ли лучший способ проверить подключение к Интернету, чем это, чтобы избежать задержки в ping адрес?
Ответы
Ответ 1
Попробуйте следующее:
Это очень просто и быстро:
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
}
Ответ 2
Попробуйте следующее:
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" />
Else:
if (InetAddress.getByName("www.google.com").isReachable(timeout))
{ }
else
{ }
Ответ 3
Первой проблемой, которую вы должны прояснить, является то, что вы подразумеваете под whether internet is available
?
- Не подключен к Wi-Fi или сотовой сети;
- Подключен к ограниченному Wi-Fi: например. В школьной сети, если вы подключаетесь к школьному Wi-Fi, вы можете напрямую получить доступ к интрасети. Но вы должны войти в систему со школьной учетной записью, чтобы получить доступ к экстранету. В этом случае, если вы выполните ping веб-сайт экстрасети, вы можете получить ответ, потому что какая-то внутренняя сеть сделала автоматический переадресацию на страницу входа в систему;
- Подключено к неограниченному Wi-Fi: вы можете получать доступ к большинству веб-сайтов;
Вторая проблема - это то, чего вы хотите достичь?
Насколько я понимаю ваше описание, кажется, вы хотите проверить подключение сети и напомнить пользователю, если он не сработает. Поэтому я рекомендую вам просто пинговать ваш сервер, что всегда хорошо, если вы хотите обмениваться данными с ним.
Вы задаетесь вопросом, есть ли лучший способ проверить подключение, а ответ - нет.
Текущая сеть TCP/IP - это виртуальная сеть с коммутацией пакетов, что означает, что для запускаемых данных не существует фиксированного "пути", т.е. не как телефон, у нас есть реальное соединение между двумя пользователями, мы можем знать, что соединение теряется сразу после прерывания цепи. Нам нужно отправить пакет в пункт назначения и не найти ответа, тогда мы знаем, что мы потеряем соединение (это то, что пинг - протокол ICMP - делает).
В заключение, у нас нет лучшего способа протестировать подключение к хосту, отличному от ping, поэтому heartbeat используется в управлении сервисами.
Ответ 4
Попробуйте этот метод, это поможет вам:
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;
}
Ответ 5
Вы можете попробовать это для проверки возможности подключения к Интернету:
/**
* 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 PERMISSION:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Попробуйте это, если вы хотите просто пинговать 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;
}
Ответ 6
При проверке этой проблемы выяснилось, что мы не можем определить, существует ли активное интернет-соединение, используя метод, указанный на сайте разработчика:
https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html
Это будет проверять только активное соединение Wi-Fi.
Итак, я нашел 2 метода, которые будут проверять наличие активного интернет-соединения
1.Программирование веб-сайта с использованием метода ниже.
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;
}
Второй метод выполняется немного быстрее, чем второй метод (который подходит для моего требования)
Спасибо всем за ответы и поддержку.
Ответ 7
Возможно, это может вам помочь:
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;
}
}
Ответ 8
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;
}
}
-
И при вызове отдыха с использованием времени ожидания клиента HTTP, как 10 секунд. Если вы не получите ответ через 10 секунд, значит, у вас нет активного подключения к Интернету, и будет исключено исключение (в основном вы получите ответ в течение 10 секунд). Не нужно проверять активное соединение, пинговая каждый раз (если вы не используете приложение "Чат" или "Приложение VOIP" )