Android проверьте подключение к Интернету

Я хочу создать приложение, использующее Интернет, и я пытаюсь создать функцию, которая проверяет, доступно ли соединение, а если нет, перейдите к действию с кнопкой повтора и объяснением.

Приложен мой код, но я получаю сообщение об ошибке Syntax error, insert "}" to complete MethodBody.

Теперь я помещал их, пытаясь заставить его работать, но пока не повезло ... Любая помощь будет оценена.

public class TheEvoStikLeagueActivity extends Activity {
    private final int SPLASH_DISPLAY_LENGHT = 3000;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);

        private boolean checkInternetConnection() {
            ConnectivityManager conMgr = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE);
            // ARE WE CONNECTED TO THE NET
            if (conMgr.getActiveNetworkInfo() != null
                    && conMgr.getActiveNetworkInfo().isAvailable()
                    && conMgr.getActiveNetworkInfo().isConnected()) {

                return true;

                /* New Handler to start the Menu-Activity
                 * and close this Splash-Screen after some seconds.*/
                new Handler().postDelayed(new Runnable() {
                    public void run() {
                        /* Create an Intent that will start the Menu-Activity. */
                        Intent mainIntent = new Intent(TheEvoStikLeagueActivity.this, IntroActivity.class);
                        TheEvoStikLeagueActivity.this.startActivity(mainIntent);
                        TheEvoStikLeagueActivity.this.finish();
                    }
                }, SPLASH_DISPLAY_LENGHT);
            } else {
                return false;

                Intent connectionIntent = new Intent(TheEvoStikLeagueActivity.this, HomeActivity.class);
                TheEvoStikLeagueActivity.this.startActivity(connectionIntent);
                TheEvoStikLeagueActivity.this.finish();
            }
        }
    }

person iamlukeyb    schedule 05.03.2012    source источник
comment
Посмотрите этот ответ: stackoverflow.com/a/39766506/3806413   -  person 0xAliHn    schedule 29.09.2016
comment
Лучший ответ находится здесь, stackoverflow.com/a/27312494/1708390. Просто пингуйте и посмотрите, действительно ли устройство подключено к Интернету   -  person Bugs Happen    schedule 05.01.2017
comment
Ознакомьтесь с этим ответом stackoverflow.com/a/44229355/6357366   -  person Omid Rostami    schedule 29.05.2017
comment
Всем, кто хочет сделать это через Kotlin, обратите внимание на этот простой проект: github.com/vivekverma6594/ Сеть-Состояние-Получатель   -  person vivek verma    schedule 28.02.2018
comment
Если кто-то хочет проверить официальный документ ConnectivityManager, можно посетить: разработчик .android.com / training / monitoring-device-state /   -  person Kalu Khan Luhar    schedule 04.01.2019


Ответы (19)


Этот метод проверяет, подключен ли мобильный телефон к Интернету, и возвращает true, если он подключен:

private boolean isNetworkConnected() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected();
}

в манифесте,

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Изменить: этот метод фактически проверяет, подключено ли устройство к Интернету (возможно, оно подключено к сети, но не к Интернету).

public boolean isInternetAvailable() {
    try {
        InetAddress ipAddr = InetAddress.getByName("google.com"); 
        //You can replace it with your name
            return !ipAddr.equals("");

        } catch (Exception e) {
            return false;
    }
}
person Seshu Vinay    schedule 05.03.2012
comment
привет, сешу, спасибо, что ответили, как мне заставить его перейти к другому действию, если он не обнаружит подключение к Интернету? - person iamlukeyb; 05.03.2012
comment
Вот что я сделал, но все еще не работает правильно if (ni == null) {// Нет активных сетей. Intent connectionIntent = новое намерение (TheEvoStikLeagueActivity.this, InfoActivity.class); TheEvoStikLeagueActivity.this.startActivity (connectionIntent); TheEvoStikLeagueActivity.this.finish (); вернуть ложь; } else return true; } - person iamlukeyb; 05.03.2012
comment
это экран-заставка, который длится 3 секунды, а затем переходит к вводному действию, но я хочу, чтобы он перед этим проверил подключение к Интернету и предоставил оператор if. если Интернет подключен, запустите заставку, если не переходите к другому мероприятию. но в данный момент он просто проходит через заставку и переходит к вступительной активности - person iamlukeyb; 05.03.2012
comment
Это неверный ответ. Если вы подключены к сети, которая не ведет к Интернету, этот метод неверно вернет true. Обратите внимание, что в javadoc getActiveNetworkInfo говорится, что вы должны проверить NetworkInfo.isConnected (), но этого также недостаточно для проверки того, что вы находитесь в Интернете. Я изучаю это дальше, но вам, возможно, придется пинговать сервер в Интернете, чтобы убедиться, что вы действительно в Интернете. - person miguel; 31.01.2014
comment
Проверяет ли он 3G, EDGE, GPRS, ... тоже? - person Dr.jacky; 07.07.2014
comment
@miguel Проверьте мой обновленный ответ. Это должно решить вашу задачу. - person Seshu Vinay; 08.08.2014
comment
Как найти подключенные к Wi-Fi, но не активные данные по Wi-Fi. - person Ganesh Katikar; 14.08.2014
comment
@GaneshKatikar Проверьте правку. isInternetAvailable () обращается к вашему случаю. - person Seshu Vinay; 16.08.2014
comment
будьте осторожны с isInternetAvailable (), поскольку он может дать сбой в сети при исключениях основного потока и, таким образом, вернуть false, даже если у вас есть соединение. - person Oren; 07.04.2015
comment
@Oren Конечно. Он не должен выполняться в основном потоке. - person Seshu Vinay; 08.04.2015
comment
isInternetAvailable () всегда возвращает false для меня. Даже при обходе улова. Я в сети 3G. - person Yster; 10.12.2015
comment
Это не определяет, что у меня нет подключения к Интернету внутри сети точки доступа Telekom. Он может разрешить Google IP: google.com/216.58.210.238. - person Timo Bähr; 05.04.2016
comment
@ TimoBähr Если он может предоставить IP-адрес Google, значит, он подключен к Интернету. - person Seshu Vinay; 05.04.2016
comment
Первая часть работает в основном потоке, вторая часть (редактирование) работает, только если не в основном потоке. - person Dale; 19.05.2016
comment
Зачем использовать InetAddress для проверки, можем ли мы получить доступ к Интернету, если у нас есть методы в SDK, чтобы проверить, выполняются ли функции isAvailable () и isConnected ()! stackoverflow.com/a/41431609/250260 - person Jorgesys; 02.01.2017
comment
@Elenasys InetAddress не требует разрешения ACCESS_NETWORK_STATE, в отличие от isAvailable () и isConnected (). Также InetAddress работает, когда мой сервер по какой-то причине недоступен, но устройство все еще подключено к Интернету. - person Seshu Vinay; 03.01.2017
comment
ознакомьтесь с этим ответом и сообщите, работает ли он stackoverflow.com/a/44229355/6357366 - person Omid Rostami; 29.05.2017
comment
Оба ответа неверны, сначала вы просто проверяете, подключен ли он к Wi-Fi (он может быть онлайн через мобильные данные или подключен к Wi-Fi, у которого нет шлюза) ... во-вторых, просто проверьте разрешение DNS, и это возможно этот GOOGLE [довольно распространенное имя] уже кэширован, на SO, в маршрутизаторе или где-либо еще, но соединение недоступно - person Rafael Lima; 15.06.2018
comment
Я вижу, что все используют Google как тестовый домен. Возможно, лучше было бы использовать [a-m] .root-servers.org - person Diblo Dk; 14.03.2019
comment
Класс NetworkInfo устарел на уровне API 29. См. Документы: developer.android.com/reference/android/net/NetworkInfo.html. - person Siarhei Kavaleuski; 11.09.2019
comment
comment
android.permission.ACCESS_WIFI_STATE здесь не нужен. - person Thomas; 27.10.2019
comment
Первый ответ устарел, а второй ответ, безусловно, требует, чтобы работа выполнялась асинхронно. - person Kartikey Kumar Srivastava; 29.04.2020
comment
Исходный код для InetAddress.equals () настроен так, чтобы всегда возвращать false (Android 30) должен был прибегнуть к tostring, а затем равно - person Richard Muvirimi; 05.10.2020
comment
Адреса DNS кэшируются. В качестве теста зациклите этот метод, а затем отключите маршрутизатор от Интернета. Он продолжает возвращать истину ... хотя в конечном итоге он выйдет из строя, когда истечет время ожидания кеша DNS (что сильно зависит от DNS-клиента). Единственный верный способ - попытаться подключиться к чему-то в Интернете и надеяться, что они не против, чтобы вы наводнили их соединениями. - person Jeffrey Blattman; 05.02.2021
comment
Фактически, адреса кэшируются на виртуальной машине навсегда: по умолчанию, когда установлен диспетчер безопасности, для защиты от атак с подменой DNS результаты положительных разрешений имен хостов кэшируются навсегда. - developer.android.com/reference/java/net/ - person Jeffrey Blattman; 05.02.2021

Убедитесь, что он подключен к сети:

public boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
    return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected();
}

Убедитесь, что он подключен к Интернету:

public boolean isInternetAvailable() {
    try {
        InetAddress address = InetAddress.getByName("www.google.com");
        return !address.equals("");
    } catch (UnknownHostException e) {
        // Log error
    }
    return false;
}

Требуется разрешение:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

https://stackoverflow.com/a/17583324/950427

person Jared Burrows    schedule 20.04.2013
comment
Как найти подключенные к Wi-Fi, но не активные данные по Wi-Fi. - person Ganesh Katikar; 14.08.2014
comment
Сообщает только, если вы подключены к сети, а не к Интернету. Если вам нужны сбои (для безопасного кода в Интернете), используйте это. - person Oliver Dixon; 27.04.2015
comment
@ Джаред, ты испортил адский контекст - person Shahid Karimi; 07.05.2016
comment
Чем это отличается от принятого ответа? - person Seshu Vinay; 20.09.2017
comment
@SeshuVinay Прочтите дату. Я разместил это более 4 лет назад. - person Jared Burrows; 20.09.2017
comment
Мое тестовое устройство, похоже, кеширует IP-адрес сервера Google, поэтому isInternetAvailable всегда возвращает true. Можно использовать другой сервер, но это не очень надежно. Могу я что-нибудь сделать с кешированием? - person Martin Braun; 11.10.2018
comment
isInternetAvailable - довольно хороший ответ, но есть проблема. Если пользователь использует VPN, а хост заблокирован, этот метод возвращает false. - person Vaios; 19.12.2018
comment
comment
NetworkOnMainThreadException! - person roghayeh hosseini; 28.11.2020

Вы можете просто проверить связь с интернет-сайтом, например google:

public boolean isConnected() throws InterruptedException, IOException {
    String command = "ping -c 1 google.com";
    return Runtime.getRuntime().exec(command).waitFor() == 0;
}
person razz    schedule 09.12.2015
comment
Это возвращает false, даже если я подключен к Интернету. Любая идея? - person Mahendra Chhimwal; 03.10.2016
comment
Хороший, но не лучший. Вся логика зависит от google.com, давайте предположим, что если Google не работает в течение нескольких минут, ваше приложение не будет работать в течение нескольких минут. - person Zeeshan Shabbir; 01.11.2016
comment
@BugsHappen лол. Когда дело доходит до логики, нельзя соврать на чем-то неудобном. А несколько месяцев назад весь интернет был отключен. Все может случиться, братан. Плюсы хорошего и плохого мира. - person Zeeshan Shabbir; 05.01.2017
comment
так что вы предлагаете? - person Bugs Happen; 05.01.2017
comment
Что ж, @ZeeshanShabbir прав, солнечная вспышка в той части страны, где работает Google, вынудит ваше приложение прямо из парка мячей, в таком сценарии вы могли бы, вероятно, пинговать несколько адресов, чтобы проверить то же самое. Кроме того, я думаю, что Google не выйдет из строя, если один из центров выйдет из строя, большинство из них должны быть отключены, чтобы это работало, также при условии, что ваш сетевой оператор переживет всемирное отключение электроэнергии: D - person TheAnimatrix; 08.01.2017
comment
Если ваше приложение полагается на удаленный сервер (для аутентификации, получения данных, связи с базой данных и т. Д.), Вы можете использовать этот адрес сервера вместо Google, таким образом вы можете одновременно проверить подключение к Интернету и доступность сервера. время. Если ваш сервер не работает, но подключение к Интернету все еще есть, приложение все равно не будет работать должным образом. В этом случае вы также можете установить интервал тайм-аута для команды ping с помощью опции -i, подобной этой ping -i 5 -c 1 www.myserver.com. - person razz; 29.04.2017
comment
как установить тайм-аут ?? Я хочу пинговать только в течение 5 секунд, если пинг не получит ответа в течение 5 секунд, он вернет false, иначе true .... что мне нужно сделать для этого .. ?? . Извините за мой английский - person Ajay Mistry; 19.09.2017
comment
Я использую головной запрос к собственному серверу приложений, чтобы проверить доступность сервера в моем приложении. в конце концов, мой сервер не учитывает сервер Google. - person Amir Ziarati; 31.12.2017
comment
Будет ли этот метод ложно возвращать истину в сценариях, где есть страница входа в Wi-Fi? - person Roymunson; 26.06.2018
comment
@Roymunson Я не тестировал его, но он должен вернуть false, потому что проверенный сервер не будет доступен, пока вы не войдете в систему. - person razz; 26.06.2018
comment
он возвращает false слишком поздно. не очень хороший - person nafees ahmed; 12.11.2018
comment
@razzak не требует каких-либо затрат на проверку связи с вашим собственным сервером с точки зрения использования сети на стороне сервера ... тогда было бы лучше выполнить проверку связи только с Google - person DragonFire; 21.12.2019
comment
@razzak, а затем, в качестве альтернативы, Google остановит пинги от вашего приложения, если оно каждый раз получает миллионы пингов, а затем - person DragonFire; 21.12.2019
comment
@DragonFire размер пакета ping обычно составляет 56 байтов, что незначительно (1 миллион ping = 56 * 1000000 байт = 56 МБ). Я не знаю, как Google управляет своими серверами, но если вы создаете приложение, которое требует миллионов запросов ping каждый день, вам определенно следует подумать о том, чтобы вместо этого проверить свой собственный сервер. - person razz; 23.12.2019
comment
отлично работает для меня. Спасибо, @razzak. - person Farhan Anwar; 01.02.2020
comment
@razzak - так сколько времени займет ответ, если я подключился к Wi-Fi без данных? Вы справились с этим? - person Arnold Brown; 11.02.2020
comment
Разветвление процесса - это очень тяжелый метод для достижения этой цели. Смотрите другие ответы. - person Jeffrey Blattman; 05.02.2021
comment
Аргумент -c был заменен на -n: ping -n 1 google.com - person gustavoknz; 17.05.2021

Вышеупомянутые методы работают, когда вы подключены к источнику Wi-Fi или через пакеты данных сотового телефона. Но в случае подключения к Wi-Fi бывают случаи, когда вас дополнительно просят войти в систему, как в кафе. Так что в этом случае ваше приложение выйдет из строя, поскольку вы подключены к источнику Wi-Fi, но не подключены к Интернету.

Этот метод работает нормально.

    public static boolean isConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager)context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork != null && activeNetwork.isConnected()) {
        try {
            URL url = new URL("http://www.google.com/");
            HttpURLConnection urlc = (HttpURLConnection)url.openConnection();
            urlc.setRequestProperty("User-Agent", "test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1000); // mTimeout is in seconds
            urlc.connect();
            if (urlc.getResponseCode() == 200) {
                return true;
            } else {
                return false;
            }
        } catch (IOException e) {
            Log.i("warning", "Error checking internet connection", e);
            return false;
        }
    }

    return false;

}

Используйте это в отдельном потоке от основного потока, поскольку он выполняет сетевой вызов и генерирует исключение NetwrokOnMainThreadException, если не выполняется.

А также не помещайте этот метод внутрь onCreate или любого другого метода. Поместите его в класс и получите к нему доступ.

person Bhargav Jhaveri    schedule 06.02.2014
comment
Это хороший подход к проблеме. Но наверное пинга хватит - person dazito; 27.05.2014
comment
Трудности, связанные с потоковой передачей, когда вам просто нужно просто проверить ответ в Интернете, не стоят усилий. Ping выполняет свою работу без всяких усилий. - person MbaiMburu; 25.07.2018

Вы можете использовать следующий фрагмент, чтобы проверить подключение к Интернету.

Это будет полезно в обоих случаях, так как вы можете проверить, какой Тип СЕТЕВОГО подключения доступен, чтобы вы могли выполнять свой процесс таким образом.

Вам просто нужно скопировать следующий класс и вставить прямо в свой пакет.

/**
 * @author Pratik Butani
 */
public class InternetConnection {

    /**
     * CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT
     */
    public static boolean checkConnection(Context context) {
        final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        if (connMgr != null) {
            NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo();

            if (activeNetworkInfo != null) { // connected to the internet
                // connected to the mobile provider's data plan
                if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                    // connected to wifi
                    return true;
                } else return activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
            }
        }
        return false;
    }
}

Теперь вы можете использовать как:

if (InternetConnection.checkConnection(context)) {
    // Its Available...
} else {
    // Not Available...
}

НЕ ЗАБЫВАЙТЕ РАЗРЕШЕНИЕ :) :)

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

Вы можете изменить в соответствии с вашими требованиями.

Спасибо.

person Pratik Butani    schedule 21.10.2015
comment
android.permission.ACCESS_WIFI_STATE здесь не нужен. - person Thomas; 27.10.2019

В принятом ответе EDIT показано, как проверить, доступно ли что-то в Интернете. Мне пришлось слишком долго ждать ответа, хотя это было не так (с Wi-Fi, у которого НЕТ подключения к Интернету). К сожалению, InetAddress.getByName не имеет параметра тайм-аута, поэтому следующий код работает с этим:

private boolean internetConnectionAvailable(int timeOut) {
    InetAddress inetAddress = null;
    try {
        Future<InetAddress> future = Executors.newSingleThreadExecutor().submit(new Callable<InetAddress>() {
            @Override
            public InetAddress call() {
                try {
                    return InetAddress.getByName("google.com");
                } catch (UnknownHostException e) {
                    return null;
                }
            }
        });
        inetAddress = future.get(timeOut, TimeUnit.MILLISECONDS);
        future.cancel(true);
    } catch (InterruptedException e) {
    } catch (ExecutionException e) {
    } catch (TimeoutException e) {
    } 
    return inetAddress!=null && !inetAddress.equals("");
}
person Hans    schedule 16.12.2015
comment
Это сработало очень хорошо для одной странной проверки, когда мне не нужно управлять состоянием «достижимости». - person Hunter-Orionnoir; 02.08.2016
comment
Этот метод возвращает false, даже если я подключен к Интернету. Любая идея? - person Mahendra Chhimwal; 03.10.2016
comment
Это должен быть принятый ответ. - person no_profile; 26.08.2019
comment
Спасибо, работает как шарм ‹3 - person hieuht; 03.09.2020
comment
Исходный код для InetAddress.equals () настроен так, чтобы всегда возвращать false (Android 30) должен был прибегнуть к tostring, а затем равно - person Richard Muvirimi; 05.10.2020

Вы не можете создать метод внутри другого метода, переместите private boolean checkInternetConnection() { метод из onCreate

person MByD    schedule 05.03.2012
comment
вы можете создать поток, чтобы выполнять непрерывный поиск доступности сети и сообщать вам об этом и продолжать попытки после определенного интервала. - person Vipin Sahu; 25.01.2013

Все официальные методы только говорят, открыто ли устройство для сети или нет.
Если ваше устройство подключено к Wi-Fi, но Wi-Fi не подключен к Интернету, этот метод не сработает (что случается много раз). Никакой встроенный метод обнаружения сети не будет расскажите об этом сценарии, поэтому был создан класс Async Callback, который будет возвращать в onConnectionSuccess и onConnectionFail

new CheckNetworkConnection(this, new CheckNetworkConnection.OnConnectionCallback() {

    @Override
    public void onConnectionSuccess() {
        Toast.makeText(context, "onSuccess()", toast.LENGTH_SHORT).show();
    }

    @Override
    public void onConnectionFail(String msg) {
        Toast.makeText(context, "onFail()", toast.LENGTH_SHORT).show();
    }
}).execute();

Сетевой вызов из асинхронной задачи

public class CheckNetworkConnection extends AsyncTask < Void, Void, Boolean > {
    private OnConnectionCallback onConnectionCallback;
    private Context context;

    public CheckNetworkConnection(Context con, OnConnectionCallback onConnectionCallback) {
        super();
        this.onConnectionCallback = onConnectionCallback;
        this.context = con;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Boolean doInBackground(Void...params) {
        if (context == null)
            return false;

        boolean isConnected = new NetWorkInfoUtility().isNetWorkAvailableNow(context);
        return isConnected;
    }

    @Override
    protected void onPostExecute(Boolean b) {
        super.onPostExecute(b);

        if (b) {
            onConnectionCallback.onConnectionSuccess();
        } else {
            String msg = "No Internet Connection";
            if (context == null)
                msg = "Context is null";
            onConnectionCallback.onConnectionFail(msg);
        }

    }

    public interface OnConnectionCallback {
        void onConnectionSuccess();

        void onConnectionFail(String errorMsg);
    }
}

Фактический класс, который будет пинговать сервер

class NetWorkInfoUtility {

    public boolean isWifiEnable() {
        return isWifiEnable;
    }

    public void setIsWifiEnable(boolean isWifiEnable) {
        this.isWifiEnable = isWifiEnable;
    }

    public boolean isMobileNetworkAvailable() {
        return isMobileNetworkAvailable;
    }

    public void setIsMobileNetworkAvailable(boolean isMobileNetworkAvailable) {
        this.isMobileNetworkAvailable = isMobileNetworkAvailable;
    }

    private boolean isWifiEnable = false;
    private boolean isMobileNetworkAvailable = false;

    public boolean isNetWorkAvailableNow(Context context) {
        boolean isNetworkAvailable = false;

        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        setIsWifiEnable(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected());
        setIsMobileNetworkAvailable(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected());

        if (isWifiEnable() || isMobileNetworkAvailable()) {
            /*Sometime wifi is connected but service provider never connected to internet
            so cross check one more time*/
            if (isOnline())
                isNetworkAvailable = true;
        }

        return isNetworkAvailable;
    }

    public boolean isOnline() {
        /*Just to check Time delay*/
        long t = Calendar.getInstance().getTimeInMillis();

        Runtime runtime = Runtime.getRuntime();
        try {
            /*Pinging to Google server*/
            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();
        } finally {
            long t2 = Calendar.getInstance().getTimeInMillis();
            Log.i("NetWork check Time", (t2 - t) + "");
        }
        return false;
    }
}
person Lokesh Tiwari    schedule 17.11.2015
comment
обратите внимание, что Runtime может использоваться только в приложениях с root-доступом, насколько мне известно - person Zulqurnain Jutt; 26.03.2019
comment
лучшее решение, которое я нашел, оно определяет, доступен ли Интернет, когда вы подключены к сети Wi-Fi или данным мобильного телефона. Отличная работа. - person zakaria; 18.10.2019
comment
К сожалению, на некоторых устройствах samsung пинг не разрешен. - person Ayyappa; 07.09.2020

Не нужно усложнять. Самый простой и понятный способ - использовать ACCESS_NETWORK_STATE разрешение и просто создать связанный метод

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnectedOrConnecting();
}

Вы также можете использовать requestRouteToHost, если у вас есть конкретный хост и тип подключения (Wi-Fi / мобильный).

Также вам понадобятся:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

в вашем манифесте Android.

для получения более подробной информации перейдите сюда

person AndroidGeek    schedule 11.07.2014
comment
эта функция всегда возвращает ИСТИНА - person DolDurma; 27.08.2014
comment
Это работает для меня. Эта ссылка может помочь .. stackoverflow.com/questions/1560788/ - person AndroidGeek; 27.08.2014

Используйте этот метод:

public static boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    return netInfo != null && netInfo.isConnectedOrConnecting();
}

Это необходимое разрешение:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
person Iman Marashi    schedule 19.12.2015
comment
дублируется и неверно возвращает истину при подключении без маршрутизации через Интернет - person Eliot Gillum; 17.07.2017

Попробуйте следующий код:

public static boolean isNetworkAvailable(Context context) {
        boolean outcome = false;

        if (context != null) {
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo[] networkInfos = cm.getAllNetworkInfo();

            for (NetworkInfo tempNetworkInfo : networkInfos) {


                /**
                 * Can also check if the user is in roaming
                 */
                if (tempNetworkInfo.isConnected()) {
                    outcome = true;
                    break;
                }
            }
        }

        return outcome;
    }
person Praful Bhatnagar    schedule 05.03.2012
comment
Вот что у меня есть частное логическое значение isNetworkConnected () {ConnectivityManager cm = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE); NetworkInfo ni = cm.getActiveNetworkInfo (); if (ni == null) {// Нет активных сетей. Intent connectionIntent = новое намерение (TheEvoStikLeagueActivity.this, InfoActivity.class); TheEvoStikLeagueActivity.this.startActivity (connectionIntent); TheEvoStikLeagueActivity.this.finish (); вернуть ложь; } else return true; } - person iamlukeyb; 05.03.2012
comment
Пожалуйста, попробуйте опубликованный мной фрагмент кода, чтобы проверить, может ли устройство подключаться к удаленному серверу или нет ... - person Praful Bhatnagar; 06.03.2012

в манифесте

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

в коде,

public static boolean isOnline(Context ctx) {
    if (ctx == null)
        return false;

    ConnectivityManager cm =
            (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}
person R00We    schedule 30.12.2014
comment
android.permission.ACCESS_WIFI_STATE здесь не нужен. - person Thomas; 27.10.2019

Используйте этот код для проверки интернет-соединения

ConnectivityManager connectivityManager = (ConnectivityManager) ctx
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if ((connectivityManager
                .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null && connectivityManager
                .getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED)
                || (connectivityManager
                        .getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null && connectivityManager
                        .getNetworkInfo(ConnectivityManager.TYPE_WIFI)
                        .getState() == NetworkInfo.State.CONNECTED)) {
            return true;
        } else {
            return false;
        }
person Fahim    schedule 17.03.2015

1- создать новый файл java (щелкните правой кнопкой мыши пакет. Новый> класс> назовите файл ConnectionDetector.java

2- добавьте в файл следующий код

package <add you package name> example com.example.example;

import android.content.Context;
import android.net.ConnectivityManager;

public class ConnectionDetector {

    private Context mContext;

    public ConnectionDetector(Context context){
        this.mContext = context;
    }

    public boolean isConnectingToInternet(){

        ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        if(cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected() == true)
        {
            return true; 
        }

        return false;

    }
}

3- откройте свой MainActivity.java - действие, в котором вы хотите проверить соединение, и выполните следующие действия.

A- создать и определить функцию.

ConnectionDetector mConnectionDetector;</pre>

B- внутри "OnCreate" добавьте следующее

mConnectionDetector = new ConnectionDetector(getApplicationContext());

c- чтобы проверить соединение, выполните следующие действия.

if (mConnectionDetector.isConnectingToInternet() == false) {
//no connection- do something
} else {
//there is connection
}
person Bahi Hussein    schedule 30.08.2014

После оператора return вы не можете писать какой-либо код (кроме блока try-finally). Поместите ваши новые коды активности перед операторами "return".

person Burhan ARAS    schedule 28.05.2013

Вот функция, которую я использую как часть моего класса Utils:

public static boolean isNetworkConnected(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    return (cm.getActiveNetworkInfo() != null) && cm.getActiveNetworkInfo().isConnectedOrConnecting();
}

Используйте это как: Utils.isNetworkConnected(MainActivity.this);

person Mahendra Liya    schedule 22.05.2014
comment
Предположим, сеть все еще подключается, можно ли продолжить? - person Frozen Crayon; 07.06.2014
comment
Зависит от вашего варианта использования ... - person Mahendra Liya; 09.06.2014

У меня были проблемы с ответом IsInternetAvailable, который не тестировал сотовые сети, а только если был подключен Wi-Fi. Этот ответ работает как для Wi-Fi, так и для мобильных данных:

Как проверить подключение к сети, включить или отключить в WIFI и 3G (тарифный план) в мобильном телефоне?

person RedPanda    schedule 20.12.2014

Это еще один вариант решения любой ситуации:

public void isNetworkAvailable() {
    ConnectivityManager connectivityManager = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
    } else {
        Toast.makeText(ctx, "Internet Connection Is Required", Toast.LENGTH_LONG).show();

    }
}
person Zafer Celaloglu    schedule 08.08.2014
comment
ctx - это контекст, который должен быть глобальным. - person Jared Burrows; 23.12.2014
comment
да, вы правы! нам нужно определить его как глобальную переменную - person Zafer Celaloglu; 24.12.2014

Проверьте доступность сети в Android со скоростью передачи данных в Интернете.

public boolean isConnectingToInternet(){
        ConnectivityManager connectivity = (ConnectivityManager) Login_Page.this.getSystemService(Context.CONNECTIVITY_SERVICE);
          if (connectivity != null)
          {
              NetworkInfo[] info = connectivity.getAllNetworkInfo();
              if (info != null)
                  for (int i = 0; i < info.length; i++)
                      if (info[i].getState() == NetworkInfo.State.CONNECTED)
                      {
                          try
                            {
                                HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
                                urlc.setRequestProperty("User-Agent", "Test");
                                urlc.setRequestProperty("Connection", "close");
                                urlc.setConnectTimeout(500); //choose your own timeframe
                                urlc.setReadTimeout(500); //choose your own timeframe
                                urlc.connect();
                                int networkcode2 = urlc.getResponseCode();
                                return (urlc.getResponseCode() == 200);
                            } catch (IOException e)
                            {
                                return (false);  //connectivity exists, but no internet.
                            }
                      }

          }
          return false;
    }

Эта функция возвращает истину или ложь. Требуется разрешение пользователя

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
person Md Imran Choudhury    schedule 15.04.2015