- Для Android проверить подключение к интернету [дубликат]
- 20 ответов:
- Как узнать, подключен ли Wi-Fi на Android?
- Android — Wi-Fi
- пример
- Wi-Fi и много других аббревиатур. Как в Android приложении получить данные об узлах Wi-Fi и не опухнуть
- 1. Создаем проект
- 2. Разрешения на доступы
- 3. Создаем BroadcastReceiver и подписываемся на события обновления данных о сканировании сетевого окружения Wi-Fi
- 4. Смотрим на ScanResult и разбираемся в терминах
- 5. Разбираемся в аббревиатурах и парсим capabilities
- 6. Создаем модель и функцию парсинга
- 8. Смотрим результат
Для Android проверить подключение к интернету [дубликат]
этот вопрос уже есть ответ здесь:
- Как проверить доступ в интернет на Android? InetAddress не раз 49 ответы
Я хочу создать приложение, которое использует интернет, и я пытаюсь создать функцию, которая проверяет, доступно ли соединение, а если нет, перейдите к действию, которое имеет кнопку повтора и объяснение.
прилагается мой код до сих пор, но я получаю ошибку Syntax error, insert «>» to complete MethodBody.
теперь я помещаю их в попытке заставить его работать, но до сих пор не повезло. Любая помощь будет оценена по достоинству.
20 ответов:
этот метод проверяет, подключен ли мобильный телефон к интернету и возвращает true, если он подключен:
Edit: Этот метод фактически проверяет, подключено ли устройство к интернету (есть возможность, что оно подключено к сети, но не к интернету).
убедитесь, что он «подключен» к сети:
убедитесь, что он «подключен» к сети:
вы можете просто пинговать онлайн-сайт, как google:
вышеуказанные методы работают, когда вы подключены к источнику Wi-Fi или через пакеты данных сотового телефона. Но в случае подключения Wi-Fi есть случаи, когда вас дополнительно просят войти в систему, как в кафе. Так что в этом случае ваше приложение не удастся, как вы подключены к источнику Wi-Fi, но не с Интернетом.
этот метод работает отлично.
пожалуйста, используйте это в отдельном потоке от основного потока, как это делает сетевой вызов и будет бросать NetwrokOnMainThreadException если не следовать.
а также не помещайте этот метод в onCreate или любой другой метод. Поместите его в класс и получите к нему доступ.
редактирование принятого ответа показывает, как проверить, можно ли что-то в интернете. Мне пришлось слишком долго ждать ответа, когда это было не так (с Wi-Fi, который не имеет подключения к интернету). К Сожалению InetAddress.getByName не имеет параметра timeout, поэтому следующий код работает вокруг этого:
вы не можете создать метод внутри другого метода, перемещение private boolean checkInternetConnection() < способ из onCreate
вы можете использовать следующий фрагмент для проверки подключения к интернету.
это будет полезно в обоих случаях, что вы можете проверить, какие тип сеть Соединение доступно, так что вы можете сделать свой процесс на этом пути.
вы просто должны скопировать следующий класс и вставить непосредственно в пакет.
Теперь вы можете использовать как:
Не забудьте взять разрешение 🙂 🙂
вы можете изменить на основе ваших требований.
все официальные методы только говорит, открыто ли устройство для сети или нет,
если ваше устройство подключено к Wi-Fi, но Wifi не подключен к интернету, то этот метод не будет работать (что происходит много раз), никакой встроенный метод обнаружения сети не расскажет об этом сценарии, поэтому созданный асинхронный класс обратного вызова, который вернется в onConnectionSuccess и onConnectionFail
сетевой вызов из асинхронного режима Задача
фактический класс, который будет пинговать на сервер
не нужно быть сложным. Самый простой и рамочный способ-использовать ACCESS_NETWORK_STATE разрешение и просто сделать подключенный метод
вы также можете использовать requestRouteToHost Если у вас есть particualr хост и тип подключения (wifi/mobile) в виду.
в вашем манифесте android.
для более подробной информации иди сюда
Источник
Как узнать, подключен ли Wi-Fi на Android?
Я не хочу, чтобы мой пользователь даже пытался загрузить что-то, если у них нет Wi-Fi. Тем не менее, я могу только сказать, могу ли сказать, включен ли Wi-Fi, но у них все еще может быть 3G-соединение.
Однако государство не то, что я ожидаю. Несмотря на то, что Wi-Fi подключен, я становлюсь OBTAINING_IPADDR как состояние.
Вы должны иметь возможность использовать ConnectivityManager для получения состояния адаптера Wi-Fi. Оттуда вы можете проверить, подключен ли он или даже доступен .
ПРИМЕЧАНИЕ. Следует отметить (для нас n00bies здесь), что вам нужно добавить
AndroidManifest.xml для этого.
ПРИМЕЧАНИЕ2 : public NetworkInfo getNetworkInfo (int networkType) теперь устарела:
Этот метод устарел на уровне API 23. Этот метод не поддерживает несколько подключенных сетей того же типа. Вместо этого используйте getAllNetworks () и getNetworkInfo (android.net.Network).
Поскольку метод NetworkInfo.isConnected () теперь устарел в API-23 , вот метод, который определяет, включен ли адаптер Wi-Fi, а также подключен к точке доступа с помощью WifiManager:
Я просто использую следующее:
Который вернет одно из этих состояний во время вызова getSupplicantState ();
ASSOCIATED – Ассоциация завершена.
ASSOCIATING – попытка связать с точкой доступа.
COMPLETED – завершена аутентификация.
DISCONNECTED – это состояние указывает, что клиент не связан, но, вероятно, начнет искать точку доступа.
DORMANT – состояние, добавленное Android, которое сообщается, когда клиент выдает явную команду DISCONNECT.
FOUR_WAY_HANDSHAKE – Выполняется рукописное письмо с 4-сторонним ключом WPA.
GROUP_HANDSHAKE – Рукопожатие группы ключей WPA продолжается.
НЕАКТИВНО – Неактивное состояние.
INVALID – псевдо-состояние, которое, как правило, никогда не будет видно.
СКАНИРОВАНИЕ – Сканирование сети.
UNINITIALIZED – нет связи.
Я рассмотрел несколько таких вопросов и придумал следующее:
Я использую, если для моей проверки лицензии в Root Toolbox PRO, и, похоже, он отлично работает.
Я использую это в своих приложениях, чтобы проверить, является ли активная сеть Wi-Fi:
Попробуйте этот метод.
Этот метод поможет найти доступ к Интернету или нет.
Хотя ответ Джейсона правильный, в настоящее время getNetWorkInfo (int) является устаревшим методом. Таким образом, следующая функция будет хорошей альтернативой:
Вот что я использую в своих приложениях как служебный метод:
Используя WifiManager вы можете:
Метод getNeworkId возвращает -1 только тогда, когда он не подключен к сети;
Это работает для меня:
И добавьте это разрешение:
В новой версии Android
Это более легкое решение. См. Вопрос «Переполнение стека». Проверка Wi-Fi включен или нет на Android .
PS Не забудьте добавить код в файл manifest.xml, чтобы разрешить его. Как показано ниже.
Это возвращает 0 до тех пор, пока устройство не будет иметь удобное соединение (на моей машине, Samsung SM-T280, Android 5.1.1).
Вы можете включить WIFI, если он не активирован следующим образом: 1. проверьте состояние WIFI, как было указано в @Jason Knight 2. Если не активировано, активируйте его, не забудьте добавить разрешение WIFI в файл манифеста
Источник
Android — Wi-Fi
Android позволяет приложениям получать доступ для просмотра состояния доступа беспроводных соединений на очень низком уровне. Приложение может получить доступ практически ко всей информации о подключении Wi-Fi.
Информация, к которой приложение может получить доступ, включает скорость соединения в подключенной сети, IP-адрес, состояние согласования, другую информацию о сети. Приложения также могут сканировать, добавлять, сохранять, прерывать и инициировать соединения Wi-Fi.
Android предоставляет WifiManager API для управления всеми аспектами подключения WIFI. Мы можем создать экземпляр этого класса, вызвав метод getSystemService . Его синтаксис приведен ниже —
Для сканирования списка беспроводных сетей вам также необходимо зарегистрировать свой BroadcastReceiver. Он может быть зарегистрирован с помощью метода registerReceiver с аргументом вашего объекта класса получателя. Его синтаксис приведен ниже —
Сканирование wifi можно запустить, вызвав метод startScan класса WifiManager. Этот метод возвращает список объектов ScanResult. Вы можете получить доступ к любому объекту, вызвав метод get из списка. Его синтаксис приведен ниже —
Помимо простого сканирования, вы можете лучше контролировать свой WIFI с помощью методов, определенных в классе WifiManager. Они перечислены следующим образом —
addNetwork (конфигурация WifiConfiguration)
Этот метод добавляет новое описание сети в набор настроенных сетей.
createWifiLock (строковый тег)
Этот метод создает новый WifiLock.
Этот метод отсоединяется от текущей активной точки доступа.
enableNetwork (int netId, логическое значение disableOthers)
Этот метод позволяет связать ранее настроенную сеть.
Этот метод получает состояние Wi-Fi включен
Этот метод возвращает, включен ли Wi-Fi или нет.
setWifiEnabled (логическое значение включено)
Этот метод включает или отключает Wi-Fi.
updateNetwork (конфигурация WifiConfiguration)
Этот метод обновляет сетевое описание существующей настроенной сети.
addNetwork (конфигурация WifiConfiguration)
Этот метод добавляет новое описание сети в набор настроенных сетей.
createWifiLock (строковый тег)
Этот метод создает новый WifiLock.
Этот метод отсоединяется от текущей активной точки доступа.
enableNetwork (int netId, логическое значение disableOthers)
Этот метод позволяет связать ранее настроенную сеть.
Этот метод получает состояние Wi-Fi включен
Этот метод возвращает, включен ли Wi-Fi или нет.
setWifiEnabled (логическое значение включено)
Этот метод включает или отключает Wi-Fi.
updateNetwork (конфигурация WifiConfiguration)
Этот метод обновляет сетевое описание существующей настроенной сети.
пример
Вот пример, демонстрирующий использование WIFI. Это создает основное приложение, которое открывает ваш Wi-Fi и закрывает ваш Wi-Fi
Чтобы поэкспериментировать с этим примером, вам нужно запустить его на реальном устройстве, на котором включен Wi-Fi.
меры | Описание |
---|---|
1 | Вы будете использовать Android studio для создания приложения Android в пакете com.example.sairamkrishna.myapplication. |
2 | Измените файл src / MainActivity.java, чтобы добавить код WebView. |
3 | Измените res / layout / activity_main, чтобы добавить соответствующие компоненты XML |
4 | Измените AndroidManifest.xml, чтобы добавить необходимые разрешения |
5 | Запустите приложение и выберите работающее устройство Android, установите на него приложение и проверьте результаты. |
Ниже приводится содержимое измененного основного файла активности src / MainActivity.java .
Ниже приводится измененное содержимое файла xml res / layout / activity_main.xml .
Ниже приводится содержимое файла AndroidManifest.xml .
Давайте попробуем запустить ваше приложение. Я предполагаю, что вы подключили свое фактическое мобильное устройство Android к компьютеру. Чтобы запустить приложение из студии Android, откройте один из файлов деятельности вашего проекта и нажмите «Выполнить». значок с панели инструментов. Перед запуском приложения Android Studio отобразит следующее окно, чтобы выбрать опцию, в которой вы хотите запустить приложение Android.
Выберите ваше мобильное устройство в качестве опции, и оно покажет следующее изображение
Теперь нажмите на кнопку «отключить Wi-Fi». Пример вывода должен быть таким:
Источник
Wi-Fi и много других аббревиатур. Как в Android приложении получить данные об узлах Wi-Fi и не опухнуть
Однажды мне понадобилось сканировать из Android приложения сети Wi-Fi и получать подробную выкладку данных о точках доступа.
Тут пришлось столкнуться с несколькими трудностями: в офф.документации Android многие описанные классы стали deprecated (API level > 26), что никак не было в ней отражено; описание некоторых вещей в документации минимально (например поле capabilities класса ScanResult на момент написания не описано почти никак, хотя содержит много важных данных). Третья сложность может заключаться в том, что при первой близости с Wi-Fi, отличной от чтения теории и настройки роутера по localhost, приходится иметь дело с рядом аббревиатур, которые кажутся понятными по отдельности. Но может быть не очевидно, как их соотнести и структурировать (суждение субъективно и зависит от предыдущего опыта).
В данной статье рассмотрено как из Android кода получить исчерпывающие данные о Wi-Fi окружении без NDK, хаков, а лишь с помощью Android API и понять, как их интерпретировать.
Не будем тянуть и начнем писать код.
1. Создаем проект
Заметка рассчитана на тех, кто больше одного раза создавал Android проект, поэтому подробности данного пункта опускаем. Код ниже будет представлен на языке Kotlin, minSdkVersion=23.
2. Разрешения на доступы
Для работы с Wi-Fi из приложения понадобится получить от пользователя несколько разрешений. В соответствии с документацией, для того, чтобы осуществить сканирование сети на устройствах с ОС версий после 8.0, помимо доступа к просмотру состояния сетевого окружения нужен либо доступ на изменение состояния модуля Wi-Fi устройства, либо доступ к координатам (примерным или точным). Начиная с версии 9.0 необходимо запросить у пользователя и то и то, и при этом явно запросить у пользователя включить службу определения местоположения. Не забываем галантно объяснять пользователю, что это прихоть компании Google, а не наше желание устроить за ним слежку 🙂
Итого, в AndroidManifest.xml добавим:
А в коде, в котором есть ссылка на текущую Activity:
3. Создаем BroadcastReceiver и подписываемся на события обновления данных о сканировании сетевого окружения Wi-Fi
Метод WiFiManager.startScan в документации помечен как depricated с версии API 28, но офф. guide предлагает использовать его.
Итого, получили список объектов ScanResult.
4. Смотрим на ScanResult и разбираемся в терминах
Посмотрим на некоторые поля этого класса и опишем, что они означают:
SSID — Service Set Identifier – это название сети
BSSID – Basic Service Set Identifier – MAC адрес сетевого адаптера (Wi-Fi точки)
level — Received Signal Strength Indicator [dBm (русское дБм) — Децибел, опорная мощность 1 мВт.] — Показатель уровня принимаемого сигнала. Принимает значение от 0 до -100, чем дальше от 0, тем больше мощности сигнала потерялось по пути от Wi-Fi точки к вашему устройству. Подробнее можно посмотреть например на Википедии. Здесь же расскажу, что с помощью Android класса WifiManager можно проградуировать уровень сигнала по шкале от отличного до ужасного с выбранным вами шагом:
frequency — частота работы точки Wi-Fi [Гц]. Помимо самой частоты вас может заинтересовать так называемый канал. У каждой точки есть своя рабочая чистота. На момент написания текста наиболее популярным диапозоном Wi-Fi точек является 2.4 GHz. Но, если быть точнее, точка передает информацию на ваш телефон на пронумерованной частоте, близкой к названной. Количество каналов и значения соответствующих частот стандартизованы. Это сделано для того, чтобы точки поблизости работали на разных частотах, тем самым не создавая помехи друг другу и взаимно не понижая скорость и качество передачи. При этом точки работают не на одной частоте, а на диапазоне частот (пареметр channelWidth), называемом шириной канала. То есть точки, работающие на соседних (и не только на соседних, а даже на 3 от себя) каналах создают друг другу помехи. Вам может пригодится этот незамысловатый код, который позволяет вычислить номер канала по значению частоты для точек с частотой 2.4 и 5 Ghz:
capabilities — наиболее интересное поле для анализа, работа с которым потребовало много времени. Тут в строку записываются «возможности» точки. При этом подробности интерпритации строки в документации можно не искать. Вот несколько примеров того, что может лежать в этой строке:
5. Разбираемся в аббревиатурах и парсим capabilities
Стоит упомянуть, что классы пакета android.net.wifi.* использует под капотом linux-утилиту wpa_supplicant и результат вывода в поле capabilities является копией поля flags при сканировании.
Будем действовать последовательно. Рассмотрим сначала вывод такого формата, при котором внутри скобок элементы отделены знаком «-«:
Первое значение описывает т.н. метод аутентификации (authentication). То есть, какую последовательность действий должны произвести устройство и точка доступа, чтобы точка доступа позволила собой пользоваться и каким образом шифровать полезную нагрузку. На момент написания поста самые частые варианты это WPA и WPA2, при котором либо каждое подключаемое устройство напрямую, либо через т.н. RADIUS-сервер (WPA-Enterprice) предоставляет пароль по зашифрованному каналу. Скорее всего у вас дома точка доступа предоставляет подключение по этой схеме. Отличие второй версии от первой в болеее стойком шифре: AES против небезопасного TKIP. Также постепенно внедряется WPA3, более сложный и продвинутый. Теоритически может встретиться вариант с enterprice-решением CCKM (Cisco Centralized Key Managment), но мне так и не встретился.
Точка доступа могла быть настроена на аутентификацию по MAC-адресу. Или, если точка доступа предоставляет данные по устаревшему алгоритму WEP, то аутентификации фактически нет (секретный ключ тут и является ключом шифрования). Такие варианты отнесем к типу OTHER.
Ещё есть полюбившийся в общественных wi-fi метод со скрытым Captive Portal Detection — запрос аутентификации через браузер. Такие точки доступа выглядят для сканера как открытые (какими с точки зраения физического подключения и являются). Поэтому отнесем их к типу OPEN.
Второе значение можно обозначить как алгоритм использования ключей (key management). Является параметром метода аутентификации, о котором написано выше. Говорит о том, как именно происходит обмен ключами шифрования. Рассмотрим возможные варианты. EAP — используется в упомянутом WPA-Enterprice, использует базу данных для сверки введеных аутентификационных данных. SAE — используется в продвинутом WPA3, более устойчива к перебору. PSK — самый частый вариант, подразумевает ввод пароля и его передачу в зашифрованном виде. IEEE8021X — по международному стандарту (отличному от поддержанным семейством WPA). OWE (Opportunistic Wireless Encryption) является расширением стандарта IEEE 802.11, для точек, которые мы отнесли к типу OPEN. OWE обеспечивает безопасность данных, передаваемых по незащищенной сети, за счет их шифрования. Также возможен варинант когда ключей доступа нет, назовем такой вариант NONE.
Третьим параметром является т.н. метод шифрования (encryption schemes) — как именно используется шифр для зашиты передаваемых данных. Перечислим варианты. WEP — использует поточный шифр RC4, секретный ключ является ключом шифрования, что в мире современной криптографии считается неприемлемым. TKIP — используется в WPA, CKIP — в WPA2. TKIP+CKIP — может быть указан в точках умеющих WPA и WPA2 для обратной совместимости.
Вместо трех элементов можно встретить одинокую пометку WEP:
Как мы обсудили выше, этого достаточно чтобы не конкретизировать алгоритм использования ключей, которого нет, и метода шифрования, которое одно по-умолчанию.
Теперь рассмотрим такую скобочку:
Это режим работы Wi-Fi или топология сетей Wi-Fi. Вам может встретиться Режим BSS (Basic Service Set) — когда есть одна точка доступа, через которую общаются подключенные устройства. Можно встретить в локальных сетях. Как правило точки доступа нужны для того, чтобы соединять устройства из разных локальных сетей, поэтому они являются частью Extended Service Sets — ESS. Тип IBSSs (Independent Basic Service Sets) говорит о том, что устройство является частью Peer-to-Peer сети.
Ещё может попасться флаг WPS:
WPS (Wi-Fi Protected Setup) — протокол полуавтоматической инициализации сети Wi-Fi. Для инициализации пользователь либо вводит 8-символьный пароль, либо зажимает кнопку на роутере. Если ваша точка доступа относится к первому типу и этот флажок высветился напротив имени вашей точки доступа, вам настоятельно рекомендуется зайти в админку и отключить доступ по WPS. Дело в том, что часто 8-значный PIN можно узнать по MAC-адресу, либо перебрать за обозримое время, чем кто-то нечистый на руку сможет воспользоваться.
6. Создаем модель и функцию парсинга
На основе того, что выяснили выше опишем data-классами то, что получилось:
Теперь напишем функцию, которая будет парсить поле capabilities:
8. Смотрим результат
Посканирую сеть и покажу, что получилось. Показаны результаты простого вывода через Log.d:
Неосвещенным остался вопрос подключения к сети из кода приложения. Скажу только, что для того, чтобы считать сохраненные пароли ОС мобильного устройства, нужны root-права и готовность порыться в файловой системе чтобы прочитать wpa_supplicant.conf. Если логика приложения предполагает ввод пароля извне, подключение можно осуществить через класс android.net.wifi.WifiManager.
Спасибо Егору Пономареву за ценные дополнения.
Если считаете, что нужно что-то добавить или исправить, пишите в комментарии 🙂
Источник