Подтвердить что ты не робот

Как программно проверить наличие интернет-соединения в Android?

Я хочу проверить программно, есть ли интернет-соединение в Android-телефоне/эмуляторе. Поэтому, когда я уверен, что есть интернет-соединение, я позвоню в Интернет.

Итак, это похоже на "Эй эмулятор! Если у вас есть интернет-соединение, то, пожалуйста, откройте эту страницу, иначе doSomeThingElse();"

4b9b3361

Ответ 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
}