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" )