Проверьте интернет-соединение android studio kotlin

Обновлено: 13.08.2022

Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Подробнее о двунаправленных символах Юникода

/*
Вам нужно вызвать описанный ниже метод один раз. Он регистрирует обратный вызов и запускает его при изменении состояния сети.
Здесь я использовал глобальную статическую переменную, поэтому я могу использовать ее для доступа к состоянию сети в любом программном обеспечении. приложения.
*/
// Вам необходимо передать контекст при создании класса
public CheckNetwork(Context context)
this . context = context;
>
// Проверка сети
public void registerNetworkCallback()
try
ConnectivityManagerconnectionManager = (ConnectivityManager) context. getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest. Builder builder = новый NetworkRequest . Builder();
connectivityManager . registerDefaultNetworkCallback( new ConnectivityManager . NetworkCallback ()
@Override
public void onAvailable (сетевая сеть)
Переменные .isNetworkConnected = true ; // Глобальная статическая переменная
>
@Override
public void onLost (Сетевая сеть)
Переменные.isNetworkConnected = false;// Глобальная статическая переменная
>
>
);
Переменные . isNetworkConnected = false ;
> catch ( Exception e)
Variables . isNetworkConnected = false ;
>
>

Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Подробнее о двунаправленных символах Юникода

< tr>
общедоступный класс Переменные
// Глобальная переменная, используемая для хранения состояния сети
public static boolean isNetworkConnected = false ;
>

Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Подробнее о двунаправленных символах Юникода

общедоступный класс MainActivity расширяет AppCompatActivity
@Override
protected void onCreate ( Bundle saveInstanceState )
super . onCreate(savedInstanceState);
setContentView( R . layout . activity_main);
// Обратный вызов регистрации — вызов в запуск вашего приложения!
CheckNetwork network = new CheckNetwork (getApplicationContext());
network . registerNetworkCallback();
// Проверяем сетевое подключение
if ( Variables .isNetworkConnected)
// Интернет подключен
> else
// Нет подключения
>
>
>

M7mdZain прокомментировал 17 марта 2020 г. •

  1. Когда и Wi-Fi, и сотовая сеть включены, функция onLost() не прерывает соединение при отключении WiFi при переходе к сотовой сети.
  2. Когда сотовая сеть включена, функции onLost() и onAvailable() не будут прерывать соединение, когда Wi-Fi подключен и является активной сетью (поскольку это предпочтительная сеть).

решил их с помощью логического поля mIsConnected, которое указывает, подключено ли устройство к Интернету или нет. и путем отслеживания нет. подключенных сетей с помощью getAvailableNetworksCount()

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

iRYO400 прокомментировал 30 апреля 2020 г.

Привет всем, позвольте мне оставить свои пять копеек :D
Вот моя реализация сетевого подключения, которое используется там, где представлены контекст и жизненный цикл.
API21+. В версии 29 ничего не устарело

Прокомментировал ПасанБхану 30 апреля 2020 г.

@iRYO400 Спасибо за участие!

прокомментировал chidee 19 мая 2020 г.

iRYO400 прокомментировал 19 мая 2020 г.

Также вам потребуется реорганизовать NetworkHandler, так как он использует устаревший API. Проверьте мой пример выше

прокомментировал chydee 20 мая 2020 г.

Уже проверил. Спасибо @iRYO400. Большое спасибо, что поделились

GokhanArik прокомментировал 13 июля 2020 г. •

TIL, если ваш телефон подключен к сети, но сеть не имеет проверенного/работающего подключения к Интернету, это даст ложный результат, если вы используете только NET_CAPABILITY_INTERNET . Кроме того, вам также необходимо проверить NET_CAPABILITY_VALIDATED. Самое интересное: он доступен только после API 23.

Abhinav1217 прокомментировал 13 июля 2020 г.

TIL, если ваш телефон подключен к сети, но сеть не имеет проверенного/работающего подключения к Интернету, это даст ложный результат, если вы используете только NET_CAPABILITY_INTERNET . Кроме того, вам также необходимо проверить NET_CAPABILITY_VALIDATED. Самое интересное: он доступен только после API 23.

По этой причине NET_CAPABILITY_INTERNET работал ненадежно, как я упоминал ранее. Это также дает сбой, когда иногда требуется много времени для рукопожатия между маршрутизатором и устройством. Вот когда он скажет вам, что у вас нет связи, хотя на самом деле у вас просто есть немного больше времени, чтобы пройти проверку.

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

waqqas7 прокомментировал 10 сентября 2020 г.

Спасибо за код. Работает как шарм
Ура, приятель!

ExNDY прокомментировал 24 октября 2020 г. •

Комментарий TheCroid от 16 ноября 2020 г.

@EndyMellman Спасибо +1

rohit-32 прокомментировал 18 декабря 2020 г.

Вы спаситель

прокомментировал ayoubrem 23 декабря 2020 г.

jisung-choi прокомментировал 26 января 2021 г.

строка 7 в CheckNetwork.java выдает ошибку. Я хотел проверить, работает ли этот код, путем прямого копирования/загрузки, но не смог заставить его работать.

ayoubrem прокомментировал 26 января 2021 г.

какая ошибка?
у меня код работает нормально

jisung-choi прокомментировал 26 января 2021 г.

Ожидаемое всплывающее окно "класс" или "интерфейс" для строки 7. Он не будет строиться. (Я новичок в Android, поэтому помогите мне, пожалуйста.)

ayoubrem прокомментировал 26 января 2021 г.

у вас есть синтаксическая ошибка в коде
проверьте точки с запятой и скобки

jisung-choi прокомментировал 26 января 2021 г.

image

Я ничего не менял в исходном коде. Я скачал Zip-файл, переместил все java-файлы в файл Android Studio

Пришлось изменить имя файла GlobalVariable на Variable из-за Android Studio.

jisung-choi прокомментировал 26 января 2021 г.

Я попробовал вашу версию, и она у меня работает. Поэтому я думаю, что буду использовать вашу версию для своего приложения. :D

huyhb прокомментировал 4 марта 2021 г.

Abhinav1217 прокомментировал 4 марта 2021 г.

Вы можете найти несколько примеров здесь
Вы также должны попробовать официальные документы

nishantkp прокомментировал 8 марта 2021 г.

baha2046a прокомментировал 26 марта 2021 г.

  1. onLost не вызывается при первом открытии приложения. onLost вызывается, если ранее активная сеть теряет соединение. Однако onAvailable вызывается, когда приложение подключается к сети. Помимо регистрации обратного вызова, вам также необходимо проверить начальный статус статуса подключения. Чтобы проверить это, включите режим полета и войдите в систему.
  2. Как они упомянули в ответе, ваше устройство может быть подключено к 2 сетям одновременно. Таким образом, onLost(Network)/onAvailable(Network)/onCapabilitiesChanged(Network) будет вызываться для данной сети. В коде @gaucidaniel он отслеживает все сети, к которым подключено приложение, и проверяет, пуст ли список, прежде чем установить для параметра isNetworkConnected значение false.
  • NET_CAPABILITY_INTERNET, вероятно, не работает по той же причине. onCapabilitiesChanged(Network, NetworkCapabilities) вызывается для одной сети, вам нужно проверить, есть ли у какой-либо из ваших сетей возможность. Присвоение глобальной переменной значения true/false приведет к ошибке.
  • Код в моей сути взят из моего собственного проекта, я использую RxRelay в своем проекте, вам не нужно его использовать.

Согласно этому сообщению.
Ну, я думаю, нам не нужно постоянно проверять значение всех различных сетей.
На мой взгляд, просто измените isNetworkConnected на Int,
onAvailable -> +1
onLost -> -1
У меня нет доказательств, но если onAvailable и onLost вызываются правильно это должно работать.

baha2046a прокомментировал 26 марта 2021 г.

Я просто попробовал, и, похоже, это работает
2021-03-26 18:14:52.901 2434-2816/com.example.tmdb D/CheckNetwork: A 140
2021-03-26 18 :18:14.533 2434-2816/com.example.tmdb D/CheckNetwork: L 140
2021-03-26 18:18:21.915 2434-2816/com.example.tmdb D/CheckNetwork: A 141
2021-03-26 18:18:25.513 2434-2816/com.example.tmdb D/CheckNetwork: L 141
2021-03-26 18:18:30.613 2434-2816/com.example.tmdb D/CheckNetwork: A 142

Abhinav1217 прокомментировал 26 марта 2021 г.

На мой взгляд, просто измените isNetworkConnected на Int,
onAvailable -> +1,
onLost -> -1

Это действительно плохая стратегия. Эти регистры запускаются несколько раз на протяжении всего цикла приложения. Как вы определите состояние, если там оно было доступно 2 раза, но потеряно в третий раз, $ available будет 1. И тем не менее, _ifconditions_ нужно логическое значение. Он будет либо доступен, либо недоступен. Зачем тратить циклы процессора на сравнение числовых уравнений, чтобы определить, является ли условие истинным или ложным, когда вы можете просто передать логическое значение напрямую. Android OS Apis предоставила эти регистры не просто так.

Если вам интересно узнать о двойном вызове во время переключения Wi-Fi->сотовой связи, в реальном сценарии при его реализации будет обработано несколько пограничных случаев, поэтому его следует охватить. Если я правильно помню, когда сеть была переключена, onLost вызывался Wi-Fi, а затем onAvailable запускался сотовой связью при подключении.

У меня нет доказательств, но если onAvailable и onLost вызываются правильно, это должно работать.

Без доказательств ни в чем нельзя быть уверенным. Глядя на ваш код, он не будет работать, потому что вы предполагаете, что onAvailable и onLost будут вызываться линейно, что никогда не бывает. Я не вижу причин, по которым вы зарегистрировали $network, и вы не продемонстрировали, как вы используете доступные в своем приложении. Объект CheckNetwork просто обновляет значение доступной переменной, но как вы на самом деле собираетесь использовать его для определения состояния вашей сети. Опубликуйте свой код в отдельном списке и отметьте меня там, я был бы рад взглянуть на него. Давайте не будем раскрывать эту суть.

Кроме того, не называйте свои функции так же, как системные функции, я запутался, увидев, что registerDefaultNetworkCallback вызывается внутри вашей функции registerNetworkCallback.

baha2046a прокомментировал 26 марта 2021 г. •

На мой взгляд, просто измените isNetworkConnected на Int,
onAvailable -> +1,
onLost -> -1

Это действительно плохая стратегия. Эти регистры запускаются несколько раз на протяжении всего цикла приложения. Как вы определите состояние, если там оно было доступно 2 раза, но потеряно в третий раз, $ available будет 1. И тем не менее, _ifconditions_ нужно логическое значение. Он будет либо доступен, либо недоступен. Зачем тратить циклы процессора на сравнение числовых уравнений, чтобы определить, является ли условие истинным или ложным, когда вы можете просто передать логическое значение напрямую. Android OS Apis предоставила эти регистры не просто так.

Если вам интересно узнать о двойном вызове во время переключения Wi-Fi->сотовой связи, в реальном сценарии при его реализации будет обработано несколько пограничных случаев, поэтому его следует охватить. Если я правильно помню, когда сеть была переключена, onLost вызывался Wi-Fi, а затем onAvailable запускался сотовой связью при подключении.

У меня нет доказательств, но если onAvailable и onLost вызываются правильно, это должно работать.

Без доказательств ни в чем нельзя быть уверенным. Глядя на ваш код, он не будет работать, потому что вы предполагаете, что onAvailable и onLost будут вызываться линейно, что никогда не бывает. Я не вижу причин, по которым вы зарегистрировали $network, и вы не продемонстрировали, как вы используете доступные в своем приложении. Объект CheckNetwork просто обновляет значение доступной переменной, но как вы на самом деле собираетесь использовать его для определения состояния вашей сети. Опубликуйте свой код в отдельном списке и отметьте меня там, я был бы рад взглянуть на него. Давайте не будем раскрывать эту суть.

Кроме того, не называйте свои функции так же, как системные функции, я запутался, увидев, что registerDefaultNetworkCallback вызывается внутри вашей функции registerNetworkCallback.

Название связано с тем, что я просто модифицирую код из этой темы.
Чтобы использовать значение, это просто, когда значение> 0 каким-то образом существует сетевое соединение.
Насколько я знаю, это побитовое сравнение, и я не думаю, что есть измеримая производительность, отличная от true false.
Порядок вызова доступных и потерянных не имеет значения.
И я сказал, что это зависит от того, правильно ли они спроектировали обратный вызов (например, когда устройство включается один раз, вместо вызова dup будет звонить только один onAvailable, это то, что я не могу доказать на 100%).

Также я заметил проблему для базового дизайна программы из этой темы.
Регистрация обратного вызова в onCreate может привести к тому, что он будет добавлен более одного раза.
Обратный вызов хорошо работает в фоновом режиме, но если программа завершается в фоновом режиме, чтобы освободить память,
когда она становится активной, она снова запускается onCreate. Интересно, это проблема, с которой кто-то столкнулся.
Поэтому лучше
зарегистрироваться в onStart, отменить регистрацию в onStop
После внесения этой модификации я не обнаружил ничего плохого.

При разработке приложения для Android вы, вероятно, будете использовать данные с удаленных серверов. Для этого пользователю потребуется подключение к Интернету.

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

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

Однако, как разработчик, способы обработки этого случая должны доказать его важность для пользователя. Например, вам необходимо обнаруживать и отслеживать сетевые подключения. Затем решите, что сказать пользователю.

В этом случае разработка приложения, которое просто определяет подключение к Интернету, может ввести пользователя в заблуждение. Ваше приложение по-прежнему будет работать и показывать при подключении к Интернету.

Однако нельзя полагаться только на обнаружение сетевого подключения. Пользователь может быть подключен к Wi-Fi, но Wi-Fi не имеет активного интернета для подключения и доступа к данным с сервера. Это означает, что вы должны сначала определить, подключился ли пользователь к Интернету, а затем отслеживать сеть пользователя, чтобы узнать возможности Интернета.

Если это соединение активно, есть ли у него возможность доступа к сетевому серверу/данным? Активное подключение к Интернету не является гарантией возможности подключения к сети. Знание этих возможностей поможет вам вернуть правильную информацию пользователю.

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

Эта статья призвана объяснить эту концепцию и реализовать ее в приложениях Android с использованием Kotlin.

Предпосылки

Чтобы следовать этому руководству, вам необходимо:

  • Убедитесь, что вы используете последнюю версию Android Studio.
  • Иметь базовые знания о том, как использовать Android Studio IDE и Kotlin.

Фон

Мы используем ConnectivityManager() для прослушивания изменений сетевого подключения.

Затем мы сохраним эти изменения в объектах LiveData. Объект LiveData будет действовать как держатель данных, которые могут наблюдаться компонентами пользовательского интерфейса. Это упрощает синхронизацию того, что отображается на экране, с данными, сохраненными в объектах LiveData. Давайте кратко обсудим эти понятия.

Живые данные

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

Вам необходимо отслеживать различные состояния и жизненный цикл приложения Android, чтобы проверять различные обновления в компонентах приложения, чтобы показать пользователю, когда оно подключено и когда соединение потеряно.

LiveData является частью компонентов архитектуры Android. Он учитывает жизненный цикл, то есть учитывает жизненный цикл других компонентов приложения, таких как фрагменты действий или службы. Эта осведомленность гарантирует, что LiveData обновляет только те наблюдатели компонентов приложения, которые находятся в активном состоянии жизненного цикла.

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

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

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

youtube-offline

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

youtube-онлайн

Диспетчер подключения

ConnectivityManager() используется для первоначальной регистрации определенного сетевого запроса. Это класс Android, который предоставляет список всех текущих вопросов о состоянии беспроводного подключения. Он делает это, информируя их об изменении состояния сетевого подключения.

Он делает следующее:

  • Получает информацию о сетях, к которым вы подключены.
  • Отслеживает типы сетевых подключений, таких как Wi-Fi, сотовые данные и т. д.
  • Отправляет широковещательные намерения при потере или изменении сетевого подключения. Это уведомляет приложения об изменении или сбое сетевого подключения.
  • Попытка «отката» сети при потере подключения.
  • Настраивает API, чтобы приложения могли запрашивать доступные сети. Он использует этот API для мониторинга сетевых подключений и составления отчетов.

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

Настроить проект Android

Перейдите в Android Studio и создайте новый пустой проект активности. При этом помните, что мы используем Kotlin. Поэтому убедитесь, что он выбран.

create-a-kotlin-app

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

Перейдите к файлу манифеста вашего приложения и добавьте следующее:

Затем создайте новый класс Kotlin, который мы будем использовать для обработки LiveData и диспетчера подключений.

Назовите этот класс LiveDataInternetConnections

Настройка LiveData и ConnectivityManager

Класс, который мы создали выше, будет принимать ConnectivityManager() и LiveData .

Мы также получаем ссылку на ConnectivityManager(), которая будет использоваться для первоначальной регистрации определенного сетевого запроса и обратных вызовов, необходимых для доступа к сетевым статусам.

Это первое, что поможет нам получить УСЛУГИ ПОДКЛЮЧЕНИЯ. Вам нужно получить объект ConnectivityManager() и передать appContext.getSystemService() . Затем передайте в Context константу CONNECTIVITY_SERVICE и приведите ее к ConnectivityManager .

Настройка NetworkCallback

Если вы хотите отслеживать изменения в сети, вам необходимо создать обратный вызов и зарегистрировать сетевой обратный вызов в ConnectivityManager() .

Здесь мы создадим NetworkCallback(). Это базовый класс, используемый для настройки обратных вызовов NetworkRequest.

Этот обратный вызов создается путем создания объекта, расширяющего класс NetworkCallback(), полученный из ConnectivityManager() .

Этот объект даст нам возможность получить полезную информацию. Например, всякий раз, когда сеть становится доступной, будет вызываться метод onAvailable(). И как только мы теряем связь с такой сетью, вызывается метод onLost().

Такие методы поставляются с реализацией ручки по умолчанию. Вам может потребоваться предупреждение, когда вы собираетесь потерять дескриптор сети. В таком случае будет вызван метод onLosing(), информирующий вас о том, сколько времени осталось использовать это соединение. Вы можете реализовать то, что вам нужно в вашей конкретной ситуации.

В этом примере мы начнем с добавления методов onAvailable() и onLost(), как показано ниже.

Поскольку мы расширяем класс LiveData, мы можем вызвать метод postValue(). Это принимает логическое значение. Когда соединение доступно, к LiveData будет добавлено значение true, а в противном случае — false. Затем мы можем подключить наблюдатель, который будет обновлять компоненты пользовательского интерфейса на основе текущего значения.

Регистрация и отмена регистрации NetworkCallback

Для использования свойств ConnectivityManager() необходимо зарегистрировать обратный вызов. После настройки NetworkCallback() нам нужно настроить, когда регистрировать и отменять регистрацию этого обратного вызова на основе активных наблюдателей.

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

Здесь у нас будет две функции переопределения, onActive() и onInactive(), как показано ниже:

Сначала мы создаем объект сетевого запроса с помощью Builder. Затем зарегистрируйте наш сетевой обратный вызов внутри функции onActive(). Как только наблюдателей больше нет, вызывается onInactive(), и мы отменяем регистрацию обратного вызова.

Если обратный вызов был зарегистрирован с помощью registerNetworkCallback() , он будет вызываться для каждой сети, которая больше не удовлетворяет критериям обратного вызова.

Настройка наблюдателей

Теперь у нас есть класс, который будет обновлять объект LiveData состоянием подключения к Интернету. Давайте теперь установим наблюдатели/элементы пользовательского интерфейса, которые будут соответствующим образом обновляться на основе текущего значения, возвращаемого запрошенным NetworkCallback() .

Здесь мы собираемся использовать код XML для настройки пользовательского интерфейса. Как вариант, если вы используете Jetpack Compose, узнайте, как использовать наблюдатель жизненного цикла в Compose для наблюдения за компонентами пользовательского интерфейса.

Добавьте следующий код в файл activity_main.xml. Мы добавляем два невидимых текстовых представления, которые будут обновляться в зависимости от значения, возвращаемого доступным соединением.

Инициализируйте эти два объекта TextView прямо над методом onCreate().

Теперь давайте присоединим к этим элементам наблюдателя.

Из приведенного выше кода мы создали экземпляр класса, который мы создали для проверки и хранения сетевых значений. Здесь мы наблюдаем эти значения как истинные или ложные .

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

Мы уже подключили LiveDataInternetConnections к этому наблюдателю, т. е. cld.observe(this, < isConnected ->>) .

Значение, сохраненное классом LiveData, будет возвращено и сохранено как isConnected всякий раз, когда ConnectivityManager() возвращает истинное значение.

Затем мы наблюдаем за значением isConnected . Если задано значение true , TextView1 всегда должен быть видимым, а TextView2 — невидимым, и наоборот.

Тестирование приложения

Теперь это приложение готово для тестирования. Вы можете запустить его на реальном устройстве или эмуляторе.

подключено

Как только вы отключите Wi-Fi сотовой связи, приложение обновится, и станет видимым «неподключенный» TextView.

нет-подключений

Однако, если ваши сотовые данные или Wi-Fi активны, но нет активного сетевого подключения, это все равно будет показывать, что вы подключены к сети.

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

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

Проверьте возможности сети

Мы собираемся добавить дополнительную проверку, подтверждающую соединение. В дополнение к методам onAvailable() и onLost() мы добавим метод onCapabilitiesChanged(). Прямо под onAvailable() и следующей проверкой onCapabilitiesChanged().

  • onCapabilitiesChanged() проверяет наличие сетевого подключения.
  • networkCapabilities() в основном проверяет, поддерживает ли эта сеть Wi-Fi или сотовые данные. Технически существует два типа сети. Они оба могут иметь доступ к Интернету и могут быть переданы в функцию onAvailable().
  • networkCapabilities() проверяет тип сети, к которой мы подключены. Это делается путем расширения его до hasCapability() и добавления константы NET_CAPABILITY_INTERNET .

После того, как мы проверили, подключены ли мы к Wi-Fi или сотовой сети, нам нужно убедиться, что доступная сеть имеет действительное соединение. Это делается путем расширения networkCapabilities() до hasCapability() и добавления константы NET_CAPABILITY_VALIDATED. На основе возвращенных значений мы сохраним эти данные в postValue() .

Примечание. Только начиная с версии Build.VERSION_CODES.O onAvailable() всегда будет сразу же следовать вызов onCapabilitiesChanged() . В версиях ниже Build.VERSION_CODES.O , когда приложение запускается с подключением к Интернету, ничего, кроме onAvailable(), не вызывается.Таким образом, нам нужно передать здесь postValue(true) (хотя в некоторых случаях это может быть ложным срабатыванием).

При создании объекта сетевого запроса с помощью Builder нам также необходимо добавить эти возможности. Это свойство сети, которое нас больше всего интересует, чтобы проверить, есть ли в сетевом подключении Интернет. Нам нужно добавить константу NET_CAPABILITY_INTERNET в запрос Builder.

Перейдите к методу onActive() и обновите его следующим образом:

Тестирование сетевых возможностей

Мы будем использовать LogCat для тестирования этих функций. Запустите приложение и, если возможно, попробуйте использовать реальное устройство. После запуска приложения откройте LogCat, выберите запущенное приложение и отфильтруйте журналы отладки.

logcat

Откройте приложение и просмотрите сообщения logCat.

сеть-с-возможностями

Если вы откроете приложение при подключении к активной сети Wi-Fi, будет вызван метод onAvailable(). NetworkCapabilities() проверяется. Основываясь на приведенных выше сообщениях logCat, мы видим, что этот Wi-Fi может подключиться.

Далее попробуйте подключиться к сети Wi-Fi/сотовой сети, которая, как вы знаете, не имеет подключения к Интернету.

сеть-без-возможностей

Поскольку мы подключены к сети, будет успешно выполнен метод onAvailable(), за которым следует networkCapabilities(), что показывает, что мы подключены к сети Wi-Fi.

Однако это подключение недопустимо и не имеет возможности подключения. Поэтому мы не можем получить доступ к каким-либо онлайн-данным, используя это соединение. И если вы посмотрите на свое приложение, пользовательский интерфейс обновится соответствующим образом с помощью No Connection TextView.

Наконец, если вы полностью отключите Wi-Fi, будет вызван метод onLost().

потерянное-соединение

Поскольку у нас нет доступного соединения, у нас нет проверок networkCapabilities(). Текущее значение LiveData будет сохранено как false , что приведет к соответствующему обновлению элементов пользовательского интерфейса.

Заключение

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

Концепция ConnectivityManager() немного широка, и есть больше методов, которые вы можете использовать в зависимости от того, чего вы хотите достичь в своем приложении.

В этой статье рассмотрены основы ConnectivityManager() . Обязательно ознакомьтесь с документацией, чтобы узнать, что подходит для вашего приложения.

В этом уроке я расскажу вам, как проверить наличие подключения к Интернету из приложений Android. Это пошаговое руководство по языку Kotlin. Давайте узнаем, как программно проверить подключение к Интернету в Android Kotlin.

Программная проверка подключения к Интернету в Android с помощью Kotlin

1- Создайте новый проект Android Studio. Назовите его «Check_Internet_Connection» или вы можете назвать его как хотите.

2- После успешной сборки проекта сначала перейдите в файл манифеста Android и добавьте это разрешение.

3- Теперь перейдите к файлу activity_main.xml. Измените макет ограничений по умолчанию на относительный макет.

4- Мы возьмем кнопку в нашем относительном макете с шириной match_parent и высотой wrap_content. После добавления некоторых дополнительных атрибутов наш виджет Button будет выглядеть так.

5- И после этого наш окончательный файл activity_main будет выглядеть так.

ЧАСТЬ КОТЛИНА

6- Теперь перейдите к файлу MainActivity.kt. Итак, мы возьмем здесь три переменные, вот так

7- После этого мы зарегистрируем onClickListener на нашей кнопке. check_connection — это идентификатор нашей кнопки в формате XML. Здесь мы будем использовать системную службу.

9- И наш полный и окончательный MainActivity.kt будет таким.

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

Это все, что касается этого руководства по проверке подключения к Интернету на Kotlin. 🙂

ВЫВОД

Когда нет подключения к Интернету

Проверить подключение к Интернету программно Android Kotlin

Проверить подключение к Интернету программно

Значок Wi-Fi включен, поскольку соединение Wi-Fi доступно и подключено.

Проверить подключение к Интернету программно Android Kotlin

Проверить подключение к Интернету программно

В Android с помощью класса ConnectivityManager мы можем легко определить, подключено ли устройство к сети/Интернету или нет, а также мы можем определить тип доступного в настоящее время интернет-соединения, т. е. мобильные данные или Wi-Fi.

Чтобы получить статус подключения к Интернету, наше приложение должно получить разрешения INTERNET и ACCESS_NETWORK_STATE. Для этого нам нужно добавить следующие разрешения в файл манифеста Android, как показано ниже.

манифест >
.
использует-разрешение android :name= "android.permission.INTERNET" />

использует-разрешение android :name= "android.permission.ACCESS_NETWORK_STATE" />

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

В Android мы можем легко определить состояние интернет-соединения, используя метод getActiveNetworkInfo() объекта ConnectivityManager.

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

ConnectivityManager cm = (ConnectivityManager)getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE );
Информация о сети nInfo = cm.getActiveNetworkInfo();
логическое значение connect = nInfo != null && nInfo.isAvailable() && nInfo.isConnected();

Если вы заметили приведенный выше фрагмент кода, мы использовали метод getActiveNetworkInfo() объекта ConnectivityManager, чтобы узнать, доступно ли подключение к Интернету или нет.

Определить тип подключения к Интернету

В Android мы можем легко определить тип доступного в настоящее время интернет-соединения, т. е. WI-FI или мобильные данные, с помощью метода getType() объекта NetworkInfo.

Ниже приведен фрагмент кода для получения типа интернет-соединения в приложении для Android.

ConnectivityManager cm = (ConnectivityManager)getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE );
Информация о сети nInfo = cm.getActiveNetworkInfo();
логическое значение isWiFi = nInfo.getType() == Менеджер подключений. TYPE_WIFI ;

Если вы заметили приведенный выше фрагмент кода, мы использовали метод getType() объекта NetworkInfo, чтобы узнать тип интернет-соединения.

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

Пример подключения к Интернету на Android

Ниже приведен пример проверки наличия или отсутствия подключения к Интернету с использованием объекта Android ConnectivityManager.

Создайте новое приложение для Android с помощью Android Studio и назовите его как InternalConnectionExample. Если вы не знаете о создании приложения в Android Studio, ознакомьтесь с этой статьей Приложение Android Hello World.

После создания приложения откройте файл activity_main.xml по пути к папке \res\layout и напишите код, как показано ниже.

activity_main.xml

xml version= "1.0" encoding= "utf-8" ?>
LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android"
android: ориентация= "вертикальный" android :layout_width= "match_parent"
android :layout_height= "match_parent" >
Кнопка
android :id= "@+id/btnCheck"
android : layout_width= "wrap_content"
android :layout_height= "wrap_content"
android :layout_marginTop= "150dp"
android :layout_marginLeft= "100dp"
android :text= "Проверьте подключение к Интернету " />

Линейный макет >

Теперь откройте основной файл активности MainActivity.java по пути \java\com.tutlane.internalstorageexample и напишите код, как показано ниже

MainActivity.java

общедоступный класс MainActivity расширяет AppCompatActivity @Override
protected void onCreate(Bundle saveInstanceState) super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main );
Кнопка btnStatus = (Button)findViewById(R.id. btnCheck);
btnStatus.setOnClickListener( новый вид.OnClickListener() @Override
public void onClick(View v) // Проверка подключения к Интернету
if (isConnected()) Toast.makeText(getApplicationContext(), "Подключение к Интернету" , Toast. LENGTH_SHORT ). показывать();
> else Toast.makeText(getApplicationContext(), "Нет подключения к Интернету" , Toast. LENGTH_SHORT ).show();
>
>
>);
>
public boolean isConnected() booleanconnected = false ;
попробуйте ConnectivityManager cm = (ConnectivityManager)getApplicationContext().getSystemService(Context. CONNECTIVITY_SERVICE );
Информация о сети nInfo = cm.getActiveNetworkInfo();
connected = nInfo != null && nInfo.isAvailable() && nInfo.isConnected();
возврат подключен;
> catch (Exception e) Log.e("Исключение подключения", e.getMessage());
>
возврат подключен;
>
>

Если вы наблюдаете приведенный выше код, мы получаем статус подключения к Интернету с помощью объекта ConnectivityManager.

Теперь нам нужно получить разрешения INTERNET и ACCESS_NETWORK_STATE для нашего приложения Android для этого открытого файла AndroidManifest.xml и добавить разрешения, как показано ниже.

AndroidManifest.xml

xml version= "1.0" encoding= "utf-8" ?>
манифест xmlns: android = "http://schemas.android.com/apk/res/android"
package= "com.tutlane.internetconnectionexample" >
использует-разрешение android:name= "android.permission.INTERNET" />

использует-разрешение android:name= "android.permission.ACCESS_NETWORK_STATE" />

приложение
android :allowBackup= "true"
android :icon= "@mipmap/ic_launcher"
android :label= "@string/app_name"
android :roundIcon= "@mipmap/ic_launcher_round"
android :supportsRtl= "true"
android :theme= "@style/AppTheme" >
активность android :name= " .MainActivity" >
фильтр намерений >
действие android :name= "android.intent.action.MAIN" />

категория android :name= "android.intent. category.LAUNCHER" />

фильтр намерений >
активность >
приложение >
манифест >

Если вы наблюдаете приведенный выше пример, мы получаем статус подключения к Интернету и добавляем необходимые разрешения в файл AndroidManifest.xml.

Вывод примера подключения Android к Интернету

Когда мы запустим приведенный выше пример в эмуляторе Android, мы получим результат, подобный показанному ниже.

Если вы наблюдаете приведенный выше результат, когда мы нажимаем кнопку «Проверить подключение к Интернету», он получает статус подключения к Интернету, доступен ли Интернет.

Вот как мы можем проверить состояние подключения к Интернету в приложениях для Android с помощью объекта ConnectivityManager в соответствии с нашими требованиями.

Читайте также: