Как программно проверить доступность интернет-соединения в Android? - PullRequest
18 голосов
/ 25 декабря 2010

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

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

Ответы [ 7 ]

26 голосов
/ 25 декабря 2010

Метод, который я реализовал для себя:

/*
 * 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;
    }
}

Помните, что это проверка сетевого соединения. Если есть сетевое соединение, оно не обязательно должно быть интернет-соединением.

11 голосов
/ 26 февраля 2013

Подключение к сети не гарантирует подключение к Интернету.

Возможно, вы подключены к 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
}
6 голосов
/ 15 октября 2015

что касается названия вопроса, вы хотите проверить доступ в интернет,

так что самый быстрый и эффективный способ хотя бы на данный момент,

Thnx до Левит на основании его ответа https://stackoverflow.com/a/27312494/3818437

Если вы просто хотите проверить соединение с какой-либо сетью - вам все равно если интернет доступен - тогда большинство ответов здесь (включая принято), реализация 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.

Возможные вопросы

Это действительно достаточно быстро?

Да, очень быстро!

Неужели нет надежного способа проверить, доступен ли интернет, кроме тестирования чего-либо в интернете?

Не настолько, насколько я знаю, но дайте мне знать, и я отредактирую свой ответ.

Разве я не могу просто пинговать свою собственную страницу, которую я все равно хочу запросить?

Конечно! Вы можете даже проверить оба, если вы хотите различать "подключение к интернету доступно" и ваши собственные серверы доступны

Что делать, если DNS не работает?

Google DNS (например, 8.8.8.8) является крупнейшей общедоступной службой DNS в Мир. По состоянию на 2013 год он обслуживает 130 миллиардов запросов в день. Давайте просто скажем, ваше приложение не отвечает, вероятно, не будет разговором о день.

Какие разрешения требуются?

Просто доступ в интернет - какой сюрприз ^^ (кстати, вы когда-нибудь задумывались, как некоторые из предложенных здесь методов могут даже иметь удаленный клей о доступности интернета, без этого разрешения?)

3 голосов
/ 01 февраля 2016

я использовал эти два метода для проверки состояния Интернета иногда 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;
}
2 голосов
/ 25 декабря 2010

Попробуйте это:

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");           
}
0 голосов
/ 10 января 2017

От моего СТАРЫЙ ответ здесь

Просто попробуйте это

Я применил решение, предоставленное @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
}
0 голосов
/ 26 декабря 2010

Поскольку вы подключены к сети, не гарантируете, что у вас есть интернет, я просто сделал свои звонки в интернет внутри блока try catch. Затем перехватите исключение UnknownHostException для обработки без Интернета.

...