Select wifi network android

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

Я хочу создать приложение, которое показывает список доступных сетей Wi-Fi и подключаться к той сети, которая выбрана пользователем. Я внедрил часть, показывающую результаты сканирования. Теперь я хочу подключиться к определенной сети, выбранной пользователем из списка результатов сканирования. Как это сделать?

9 ответов

Вам нужно создать WifiConfiguration пример:

String networkSSID = "test"; String networkPass = "pass"; WifiConfiguration conf = new WifiConfiguration(); conf.SSID = "\"" + networkSSID + "\""; // Please note the quotes. String should contain ssid in quotes 

Затем для сети WEP вам необходимо сделать следующее:

conf.wepKeys[0] = "\"" + networkPass + "\""; conf.wepTxKeyIndex = 0; conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 

Для сети WPA вам нужно добавить такую ​​фразу:

conf.preSharedKey = "\""+ networkPass +"\""; 

Для открытой сети вам нужно сделать это:

conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 

Затем вам нужно добавить его в настройки менеджера Android wifi:

WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); wifiManager.addNetwork(conf); 

И, наконец, вам может потребоваться включить его, поэтому Android подключается к нему:

List list = wifiManager.getConfiguredNetworks(); for( WifiConfiguration i : list ) < if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) < wifiManager.disconnect(); wifiManager.enableNetwork(i.networkId, true); wifiManager.reconnect(); break; >> 

UPD: В случае WEP, если ваш пароль в шестнадцатеричном виде, вам не нужно окружать его кавычками.

это работает хорошо! спасибо 🙂 но еще одна вещь, которую я хотел бы спросить. Вам не нужно устанавливать allowPairwiseCipher, allowAuthALgorithms и allowProtocols? И как решить, какой именно атрибут установить; как вы установили WEP40 для GroupCipher для сетей WEP?

Один из способов выяснить, какие атрибуты установить, — это подключиться вручную к сети, а затем использовать функции readConfig из примера кода Майка.

Я не могу подключиться к WEP-сетям. Он показывает: получение формы IP-адреса bsc2 . и затем он не может подключиться. В чем может быть проблема ?? я могу подключиться к открытым и защищенным WPA сетям, но не с помощью WEP

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

Кто-нибудь может подсказать, будет ли приведенный выше код работать и в случае WEP / EAP с включенным wifi?

@Me-an-Droid Me-an-Droid это будет работать для WEP, для сетей EAP используйте подход, описанный здесь: stackoverflow.com/questions/4374862/…

Это работает также для сетей Wi-Fi, привязанных от другого устройства Android? Я не могу позволить этому работать!

@phcaze это не должно иметь значения. Проверьте свои настройки, особенно на телефоне Android, который предоставляет Wi-Fi сеть, может быть, он имеет какой-то «белый список» или ограничение устройства. Также проверьте, если вы можете подключиться вручную, используя обычные настройки на Android.

Читайте также:  Netgear a6150 ac1200 wifi usb

@kenota, это была проблема с именем SSID, это работает! Для решения перейдите по адресу : stackoverflow.com/questions/15225232/…

Спасибо за хорошее решение, не могли бы вы рассказать, как проверить, было ли соединение успешным или нет. Например, пользователь может ввести неправильный пароль и должен быть уведомлен об этом.

Я следую этой процедуре, и при указанных вызовах метода не возникает никаких ошибок, но объект NetworkInfo, возвращаемый ConnectivityManager.getWifiNetworkInfo (), говорит, что isConnected () имеет значение false. Я пропускаю шаг?

@user604713 user604713 для установления соединения требуется некоторое время, и, очевидно, вы должны находиться в зоне действия горячей точки.

Я следовал инструкциям, но он не работает. В настоящее время я отлаживаю на Motorola Razr i, работающем под управлением Android 4.1.2, никаких ошибок не возникает, и я нахожусь в зоне действия горячей точки.

как насчет того, если желаемая точка доступа Wi-Fi вообще не использует какой-либо пароль . Должны ли мы использовать .preSharedKey = null; или мы должны установить .preSharedKey = «»; Который правильный? @kenota

@gumuruh для открытой сети вы пропускаете раздел настройки ключей WEP и preSharedKey (ничего не пишите), а только указываете, что сеть открыта conf.allowedKeyManagement.set (WifiConfiguration.KeyMgmt.NONE);

хорошо . позвольте мне сначала попробовать эту концепцию. @kenota, мне просто интересно, каков будет эффект, если я напишу все (код), как на этой странице: stackoverflow.com/questions/24837337/…

и еще одна вещь . если я использую открытую сеть, которая вообще не содержит пароля . это код conf.allowedGroupCiphers.set (WifiConfiguration.GroupCipher.WEP40); следует стереть? @kenota

@gumuruh для открытой сети ваш код будет выглядеть примерно так: gist.github.com/kenota/0f088ad9df78cbd3d1fd

@kenota невероятный ответ, и это просто делает работу, но если вы покажете, почему настройка конфигурации в каждой строке кода такова, это будет изумительный ответ, привет

Я попытался использовать ваш пример кода для подключения к WiFi (см. Stackoverflow.com/questions/29117522/… ). Но когда я пытаюсь вызвать метод для подключения, я продолжаю получать android.system.ErrNoException: recvfrom failed: ETIMEDOUT (Тайм-аут соединения). ошибка . есть идеи как это исправить?

Я использовал этот код для подключения, но я не могу это сделать. Моя проблема: stackoverflow.com/questions/29232706/…

@kenota: всегда происходит сбой при for (WifiConfiguration i = list )< строка, сообщающая в LogCat, что: java.lang.IllegalStateException: не удалось выполнить метод действия , есть идеи, в чем может быть проблема ?!

@kenota, как узнать, действителен ли этот пароль или нет? или даже кто я могу знать, если он подключается или нет?

Читайте также:  Wi fi метро отключается

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

Он не работает для меня: он подключается напрямую к предыдущему запомненному Wi-Fi вместо подключения к новому.

Я пытаюсь реализовать этот код, но при первом подключении к сети выдается неправильный IP-адрес маршрутизатора (0.0.0.0). Однако, если я запускаю этот код во второй раз, он работает абсолютно нормально. Есть идеи, как это происходит?

@PascalKlein Чтобы проверить, успешно ли установлено соединение, необходимо настроить приемник вещания на получение SUPPLICANT_CONNECTION_CHANGE_ACTION

Я хочу добавить Wi-Fi, который еще не добавил мое устройство, поэтому этот код не работает. что проблема?

Я столкнулся с проблемой в этом. При перезапуске устройства сохраняйте пароли с автоматически удаляемыми этими кодами. Есть ли решение для этих проблем? @kenota

@kenota Как я могу проверить пароль Wi-Fi правильно или нет. Bcz в этом случае у меня работает только после перезагрузки устройства. в противном случае, если я проверил общедоступную статическую логическую isConnectionNetwork () Тогда всегда ложно до перезагрузки устройства

Я использовал ваше руководство и создал метод для подключения к Wi-Fi, но он не работает для меня! Я очень ценю, если вы можете помочь. stackoverflow.com/questions/47968837/.

Берегись!! wifiManager.getConfiguredNetworks() is null если wifi не открыт (сканирование ближайшего wifi)

@Virthuss, как ты решил эту проблему? (Что ваш WIFI подключен к ранее запомненному, а не к запрошенному)

@Virthuss @Keselme @Luciano то же самое происходило со мной, потому что новая сеть уже была сохранена. Вызовы addNetwork() вернут -1 (сбой), если это так (см. Stackoverflow.com/a/53018931/595881 ). Если новая сеть уже сохранена, вы можете просто подключиться к ней, вам не нужно добавлять ее.

более ранний ответ работает, но решение может быть проще. Перечисление через список настроенных сетей не требуется, поскольку вы получаете идентификатор сети при добавлении сети через WifiManager.

Таким образом, полное упрощенное решение будет выглядеть примерно так:

WifiConfiguration wifiConfig = new WifiConfiguration(); wifiConfig.SSID = String.format("\"%s\"", ssid); wifiConfig.preSharedKey = String.format("\"%s\"", key); WifiManager wifiManager = (WifiManager)getSystemService(WIFI_SERVICE); //remember id int netId = wifiManager.addNetwork(wifiConfig); wifiManager.disconnect(); wifiManager.enableNetwork(netId, true); wifiManager.reconnect(); 

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

Читайте также:  Удаление wi fi подключения

если пароль не используется. Должны ли мы поставить .preSharedKey = null; или мы должны просто поставить пустую строку, @seanloyola

в соответствии с javadoc enableNetwork, если вы используете логическое значение disableOthers true, то вам не нужно отключать или подключаться, это сделает оба за вас

Спасибо, это помогло мне, но как я узнаю, возвращает ли это значение true или false, я имею в виду, если он подключен или пароль принят или нет? Есть какой-нибудь метод или что-то?

Это хорошо работает на Lollipop, но не на зефире. Это как-то связано с этим: developer.android.com/about/versions/marshmallow/… ?

Я попробовал этот метод на часах с Android 8.1, и мне не нужно было делать connect () и restnect (). enableNetwork () было достаточно, чтобы заставить его работать, поэтому потенциально этот ответ мог бы быть еще более упрощен.

@LLL В моем тесте, если у вас уже есть соединение и вы хотите подключиться к новому SSID, вам нужно будет disconnect , enableNetwork , reconnect . В противном случае, так же, как то, что вы испытали.

Перед подключением сети WIFI вам необходимо проверить тип безопасности сети WIFI. В классе ScanResult есть возможности. Это поле дает вам тип сети

Существует три типа сетей WIFI.

Сначала создайте экземпляр объекта WifiConfiguration и заполните SSID сети (обратите внимание, что он должен быть заключен в двойные кавычки), установите начальное состояние отключенным и укажите приоритет сети (число вокруг 40, похоже, хорошо работает).

WifiConfiguration wfc = new WifiConfiguration(); wfc.SSID = "\"".concat(ssid).concat("\""); wfc.status = WifiConfiguration.Status.DISABLED; wfc.priority = 40; 

Теперь для более сложной части: нам нужно заполнить несколько членов WifiConfiguration, чтобы указать режим безопасности сетей. Для открытых сетей.

wfc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); wfc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); wfc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wfc.allowedAuthAlgorithms.clear(); wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 

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

wfc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); wfc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); wfc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wfc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); wfc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); if (isHexString(password)) wfc.wepKeys[0] = password; else wfc.wepKeys[0] = "\"".concat(password).concat("\""); wfc.wepTxKeyIndex = 0; 

Для сетей, использующих WPA и WPA2, мы можем установить одинаковые значения для.

wfc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); wfc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wfc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); wfc.preSharedKey = "\"".concat(password).concat("\""); 

Наконец, мы можем добавить сеть к известному списку WifiManagers

WifiManager wfMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); int networkId = wfMgr.addNetwork(wfc); if (networkId != -1) < // success, can call wfMgr.enableNetwork(networkId, true) to connect >

Источник

Оцените статью
Adblock
detector