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

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

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

Как мне это сделать?


person Vikram Gupta    schedule 11.01.2012    source источник
comment
comment
Это сработало для меня WPA2 и WEP: stackoverflow.com/a/29575563/7337517   -  person Kundan    schedule 22.07.2019


Ответы (10)


Вам необходимо создать экземпляр 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);

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

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

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

List<WifiConfiguration> 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, если ваш пароль в шестнадцатеричном формате, вам не нужно заключать его в кавычки.

person kenota    schedule 11.01.2012
comment
это хорошо работает! спасибо :) но еще кое-что хочу спросить. Разве вам не нужно устанавливать allowedPairwiseCipher, allowedAuthALgorithms и allowedProtocols? И как решить, какой именно атрибут установить; как вы установили WEP40 для GroupCipher для сетей WEP? - person Vikram Gupta; 11.01.2012
comment
Один из способов выяснить, какие атрибуты нужно установить, - это вручную подключиться к сети, а затем использовать функции readConfig из примера кода Майка. - person kenota; 11.01.2012
comment
Я не могу подключиться к сетям WEP. Он показывает: получение IP-адреса от bsc2 ..., а затем не удается подключиться. В чем может быть проблема ?? я могу подключаться к открытым и защищенным WPA сетям, но не с WEP - person Vikram Gupta; 12.01.2012
comment
Можете ли вы подключиться к этой сети вручную через настройки Android с тем же паролем? - person kenota; 12.01.2012
comment
Я забыл упомянуть одну вещь. В случае WEP, если ваш пароль в шестнадцатеричном формате, вам не нужно заключать его в кавычки. - person kenota; 12.01.2012
comment
да, я могу подключиться к нему через настройки Android. я попробую без кавычек - person Vikram Gupta; 12.01.2012
comment
Может ли кто-нибудь сказать, будет ли приведенный выше код также работать в случае Wi-Fi с включенным WEP / EAP? - person Me-an-Droid; 16.01.2013
comment
@ Me-an-Droid он будет работать для WEP, для сетей EAP используется подход, описанный здесь: stackoverflow.com/questions/4374862/ - person kenota; 16.01.2013
comment
Работает ли он также для сетей Wi-Fi, привязанных к другому устройству Android? Я не могу позволить этому работать! - person phcaze; 06.03.2013
comment
@phcaze это не имеет значения. Проверьте свои настройки, особенно на телефоне Android, который предоставляет сеть Wi-Fi, может быть, у него есть какой-то белый список или ограничение устройства. Также проверьте, можете ли вы подключиться вручную, используя обычные настройки Android. - person kenota; 06.03.2013
comment
@kenota, это проблема имени SSID, работает! Для решения перейдите по ссылке: stackoverflow.com/questions/15225232/ - person phcaze; 07.03.2013
comment
Спасибо за хорошее решение, не могли бы вы подробнее рассказать, как проверить, было ли соединение успешным или нет. Например, пользователь может ввести неправильный пароль, и его следует уведомить об этом. - person Pascal Klein; 29.03.2013
comment
Я следую этой процедуре, и при вызове указанного метода ошибок не возникает, но объект NetworkInfo, возвращаемый ConnectivityManager.getWifiNetworkInfo (), говорит, что isConnected () является ложным. Я упускаю ступеньку? - person user604713; 19.11.2013
comment
@ user604713 для подключения требуется некоторое время, и, очевидно, вы должны быть в зоне действия точки доступа. - person kenota; 19.11.2013
comment
Я выполнил инструкции, но он не работает. В настоящее время я отлаживаю Motorola Razr. Я использую Android 4.1.2. Никаких ошибок не возникает, и я нахожусь в зоне действия точки доступа. - person B. TIger; 13.05.2014
comment
как насчет того, что желаемая точка доступа Wi-Fi вообще не использует никакого пароля .... Следует ли нам использовать .preSharedKey = null; или мы должны установить .preSharedKey =; Который правильный? @kenota - person gumuruh; 19.07.2014
comment
@gumuruh для открытой сети вы пропускаете раздел настройки ключей WEP и preSharedKey (ничего не пишите), а только указываете, что сеть открыта с помощью conf.allowedKeyManagement.set (WifiConfiguration.KeyMgmt.NONE); - person kenota; 20.07.2014
comment
хорошо .... позвольте мне сначала попробовать эту концепцию. @kenota, мне просто интересно, каков будет эффект, если я напишу все (код) так же, как на этой странице: stackoverflow.com/questions/24837337/ - person gumuruh; 21.07.2014
comment
и еще кое-что ... если я использую открытую сеть, которая вообще не содержит пароля ... это код conf.allowedGroupCiphers.set (WifiConfiguration.GroupCipher.WEP40); тоже надо стереть? @kenota - person gumuruh; 26.07.2014
comment
@gumuruh для открытой сети ваш код, вероятно, будет выглядеть так: gist.github.com/kenota/0f088ad9df78cbd3d1fd < / а> - person kenota; 12.08.2014
comment
@kenota невероятный ответ, и он просто выполняет свою работу, но если вы проиллюстрируете, почему устанавливаете такую ​​конфигурацию в каждой строке кода, это будет чудесный ответ, привет - person Muhammed Refaat; 29.09.2014
comment
Где мы устанавливаем тип безопасности в конфигурации - person Utsav Gupta; 18.10.2014
comment
Есть ли какая-то особая обработка WPA2? - person unresolved_external; 29.01.2015
comment
@unresolved_external нет, просто следуйте стандартному пути WPA. - person kenota; 29.01.2015
comment
Я пробовал использовать ваш образец кода для подключения к Wi-Fi (см. stackoverflow.com/questions/29117522/). Но когда я пытаюсь вызвать метод для подключения, я продолжаю получать android.system.ErrNoException: recvfrom failed: ETIMEDOUT (время ожидания соединения истекло). ошибка ... Есть идеи, как это исправить? - person user869375; 18.03.2015
comment
Я использовал этот код для подключения, но не могу этого сделать. Моя проблема: stackoverflow.com/questions/29232706/ - person Kushal; 24.03.2015
comment
@kenota: Он всегда вылетает в строке for (WifiConfiguration i = list ){, говоря в LogCat, что: java.lang.IllegalStateException: не удалось выполнить метод действия, есть идеи, в чем может быть проблема ?! - person McLan; 14.04.2015
comment
@kenota как мне узнать, действителен этот пароль или нет? или даже кто я могу узнать, подключается он или нет? - person Skizo-ozᴉʞS; 07.07.2015
comment
@kenota прежде всего спасибо за ваше решение, оно работает для меня в более низкой версии, а что насчет более высокой версии, такой как lolipop. Там у меня была проблема, не могли бы вы опубликовать что-нибудь для этого? - person Mohan; 21.07.2015
comment
У меня это не работает: он повторно подключается непосредственно к предыдущему запомненному Wi-Fi вместо подключения к новому. - person Virthuss; 15.01.2016
comment
Я пытаюсь реализовать этот код, но при первом подключении к сети я получаю неправильный IP-адрес маршрутизатора (0.0.0.0). Однако, если я запускаю этот код во второй раз, он работает абсолютно нормально. Есть идеи, что это происходит? - person Sourav Kanta; 11.03.2016
comment
@kenota привет, можно ли получить пароль WIFI с помощью кодирования в Android? - person Hardik Parmar; 11.05.2016
comment
На Android M (6.0) и выше строка SSID идет БЕЗ кавычек, в противном случае она не работает. - person Fernando Gallego; 16.06.2016
comment
Вы можете подсказать, как подключиться к EAP типа SIM? - person Prashanth Debbadwar; 01.08.2016
comment
Не могли бы вы обновить список для IEEE8021X и WPA_EAP? - person android developer; 13.11.2016
comment
@PascalKlein Чтобы проверить, было ли соединение успешным или нет, вам нужно сделать широковещательный приемник для получения SUPPLICANT_CONNECTION_CHANGE_ACTION - person York Yang; 04.07.2017
comment
Я хочу добавить Wi-Fi, который еще не добавлен на мое устройство, поэтому этот код не работает. что проблема? - person Dhara Patel; 07.10.2017
comment
Отлично работает .. есть ли способ одновременно отключить мобильные данные - person Vishnu M Menon; 23.10.2017
comment
Я столкнулся с проблемой в этом. Когда я перезагружаю устройство, пароли сохраняются, и эти коды удаляются автоматически. Есть какое-нибудь решение для этих ??? @kenota - person Upendra Shah; 30.11.2017
comment
@kenota Как я могу проверить, верен ли пароль Wi-Fi. Bcz в этом случае у меня работает только после перезагрузки устройства. в противном случае, если я проверил общедоступное статическое логическое значение isConnectionNetwork () {final ConnectivityManager connectivityManager = ((ConnectivityManager) getContext (). getSystemService (Context.CONNECTIVITY_SERVICE)); assert connectivityManager! = ноль; вернуть ConnectivityManager.getActiveNetworkInfo ()! = null && connectivityManager.getActiveNetworkInfo (). isConnected (); } Тогда всегда ложно до перезагрузки устройства - person AngelJanniee; 20.12.2017
comment
Я использовал ваше руководство и создал метод для подключения к Wi-Fi, но у меня он не работает! Я очень признателен, если вы можете помочь. stackoverflow.com/questions/47968837/ - person Ehsan; 25.12.2017
comment
Берегись!! wifiManager.getConfiguredNetworks() is null если Wi-Fi не открыт (сканирование ближайшего Wi-Fi) - person bh_earth0; 07.05.2018
comment
@Virthuss, как вы решили эту проблему? (Что ваш WIFI подключен к ранее запомненному, а не к запрошенному) - person Keselme; 29.07.2018
comment
@Keselme, Моя тоже подключается к последнему известному коннекту .. Решение нашли? - person Luciano; 11.09.2018
comment
@Virthuss @Keselme @Luciano то же самое происходило со мной, потому что новая сеть уже была сохранена. Вызов addNetwork() вернет -1 (сбой), если это так (см. stackoverflow.com/a/53018931/595881). Если новая сеть уже сохранена, вы можете просто подключиться к ней напрямую, добавлять ее не нужно. - person Flávio Faria; 22.01.2019
comment
это все еще работает с последними версиями Android? - person Waterfr Villa; 22.05.2019
comment
Было бы здорово, если бы вы также объяснили, как проверить статус возврата, например, подключен или сбой! - person Muhammad Babar; 14.04.2020
comment
В Android 10 у меня это не работает: если у меня есть две доступные сети и я прошу приложение переключиться, телефон отключается, но затем случайным образом повторно подключается либо к той, которую я ему даю, либо к предыдущей. - person Luis A. Florit; 19.04.2020
comment
@ FlávioFaria: Проблема сохраняется даже без addNetwork(). Метод случайным образом переподключается либо к тому, что я ему даю, либо к предыдущему. - person Luis A. Florit; 19.04.2020

предыдущий ответ работает, но на самом деле решение может быть проще. Цикл через список настроенных сетей не требуется, поскольку вы получаете идентификатор сети при добавлении сети через 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();
person sean loyola    schedule 10.12.2013
comment
Я пытаюсь сделать это, но он не работает. Я выполнил его в асинхронной задаче, чтобы дать ему время для обработки, и ничего, как мне это сделать? - person B. TIger; 14.05.2014
comment
если пароль не используется. Следует ли поставить .preSharedKey = null; или мы должны просто вставить пустую строку @seanloyola? - person gumuruh; 19.07.2014
comment
зачем делать disconnect перед подключением? - person Muhammed Refaat; 15.10.2014
comment
@MuhammedRefaat вы отключаетесь, если вы уже подключены к другой сети. - person sean loyola; 23.10.2014
comment
@gumuruh вам вообще не нужно включать объект preharedkey, если ключ не требуется. - person sean loyola; 23.10.2014
comment
согласно javadoc enableNetwork, если вы используете логическое значение disableOthers true, тогда вам не нужно отключаться или подключаться, он сделает и то, и другое для вас - person NikkyD; 17.03.2015
comment
Вероятно, следует упомянуть, что требуется разрешение CHANGE_WIFI_STATE. - person ThomasW; 27.05.2015
comment
Спасибо, это помогло мне, но как я узнаю, вернет это значение true или false, я имею в виду, подключен ли он или пароль принят или нет? Есть какой-нибудь метод или что-то в этом роде? - person Skizo-ozᴉʞS; 07.07.2015
comment
@NikkyD, я попытался не включать отключение () и повторное подключение (), но безуспешно, у вас это сработало? - person MikeF; 07.06.2016
comment
Не работает на телефонах Google Pixel - person gregm; 09.02.2017
comment
Он хорошо работает на Lollipop, но не работает на Marshmallow. Имеет ли это какое-либо отношение к этому: разработчик .android.com / about / versions / marshmallow /? - person Denis; 10.04.2017
comment
Я пробовал этот метод на часах с Android 8.1, и мне не нужно было отключать () и повторно подключать (). enableNetwork () было достаточно, чтобы он заработал, поэтому потенциально этот ответ можно было бы еще больше упростить. - person LLL; 15.10.2018
comment
@LLL В моем тесте, если у вас уже есть соединение и вы хотите подключиться к новому SSID, вам потребуется disconnect, enableNetwork, reconnect. В остальном точно так же, как то, что вы испытали. - person Dino Tw; 28.03.2019
comment
можем ли мы получить какое-либо событие, если Wi-Fi не может подключиться к определенному SSID и паролю @seanloyola? - person Kuls; 02.07.2019
comment
Обратите внимание: ›wifiManager.addNetwork (wifiConfig) завершится ошибкой и вернет -1, если сетевой ssid уже присутствует в настроенных сетях, а также не удастся, если длина пароля меньше 8 символов. - person rd7773; 20.08.2020

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

Обратитесь: https://developer.android.com/reference/android/net/wifi/ScanResult.html#capabilities

Существует три типа сетей Wi-Fi.

Сначала создайте экземпляр объекта 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("\"");

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

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
} 
person raji ramamoorthi    schedule 02.09.2014
comment
Замечание о приоритете, на моих телефонных номерах работало около 4000. вероятно, лучше всего сделать эту часть немного более динамичной (повторить существующие конфигурации и т. д.) - person Sam; 01.06.2015
comment
Как я могу получить тип сетевой безопасности из SSID для Wi-Fi ScanResult - person shantanu; 14.12.2015
comment
@shantanu подробности см. ниже. stackoverflow.com/questions/6866153/ - person Kalpesh Gohel; 20.01.2016
comment
На устройствах Samsung парольная фраза представляет собой хешированную строку. И код не работает. Вы это проверяете? - person Nguyen Minh Binh; 01.06.2016
comment
можете ли вы предоставить образец для подключения EAP типа sim wifi? - person Prashanth Debbadwar; 01.08.2016
comment
Длина пароля также должна быть больше 8, иначе wfMgr.addNetwork (wfc) вернет -1. Кроме того, SSID не должен быть в предварительно настроенном списке сетей, иначе addNetwork () вернет -1. - person rd7773; 20.08.2020

Кредит @ raji-ramamoorthi и @kenota

Решение, которое сработало для меня, - это комбинация вышеперечисленных участников в этом потоке.

Чтобы получить ScanResult вот процесс.

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
if (wifi.isWifiEnabled() == false) {
            Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled", Toast.LENGTH_LONG).show();
            wifi.setWifiEnabled(true);
        }

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context c, Intent intent) {
                 wifi.getScanResults();
            }
        };

Обратите внимание на unregister это onPause & onStop в прямом эфире unregisterReceiver(broadcastReceiver);

public void connectWiFi(ScanResult scanResult) {
        try {

            Log.v("rht", "Item clicked, SSID " + scanResult.SSID + " Security : " + scanResult.capabilities);

            String networkSSID = scanResult.SSID;
            String networkPass = "12345678";

            WifiConfiguration conf = new WifiConfiguration();
            conf.SSID = "\"" + networkSSID + "\"";   // Please note the quotes. String should contain ssid in quotes
            conf.status = WifiConfiguration.Status.ENABLED;
            conf.priority = 40;

            if (scanResult.capabilities.toUpperCase().contains("WEP")) {
                Log.v("rht", "Configuring WEP");    
                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
                conf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
                conf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
                conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);

                if (networkPass.matches("^[0-9a-fA-F]+$")) {
                    conf.wepKeys[0] = networkPass;
                } else {
                    conf.wepKeys[0] = "\"".concat(networkPass).concat("\"");
                }

                conf.wepTxKeyIndex = 0;

            } else if (scanResult.capabilities.toUpperCase().contains("WPA")) {
                Log.v("rht", "Configuring WPA");

                conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
                conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

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

            } else {
                Log.v("rht", "Configuring OPEN network");
                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
                conf.allowedAuthAlgorithms.clear();
                conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
            }

            WifiManager wifiManager = (WifiManager) WiFiApplicationCore.getAppContext().getSystemService(Context.WIFI_SERVICE);
            int networkId = wifiManager.addNetwork(conf);

            Log.v("rht", "Add result " + networkId);

            List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
            for (WifiConfiguration i : list) {
                if (i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
                    Log.v("rht", "WifiConfiguration SSID " + i.SSID);

                    boolean isDisconnected = wifiManager.disconnect();
                    Log.v("rht", "isDisconnected : " + isDisconnected);

                    boolean isEnabled = wifiManager.enableNetwork(i.networkId, true);
                    Log.v("rht", "isEnabled : " + isEnabled);

                    boolean isReconnected = wifiManager.reconnect();
                    Log.v("rht", "isReconnected : " + isReconnected);

                    break;
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
person Rohit Mandiwal    schedule 23.06.2016

На уровне API 29 метод WifiManager.enableNetwork() устарел. Согласно документации Android API (проверьте здесь):

  1. См. WifiNetworkSpecifier.Builder # build () для получения информации о новом механизме подключения к сети Wi-Fi.
  2. См. AddNetworkSuggestions (java.util.List), removeNetworkSuggestions (java.util.List) для нового API для добавления сетей Wi-Fi для рассмотрения при автоматическом подключении к Wi-Fi. Примечание о совместимости: для приложений, предназначенных для Build.VERSION_CODES.Q или выше, этот API всегда будет возвращать false.

Начиная с уровня API 29, для подключения к сети Wi-Fi необходимо использовать WifiNetworkSpecifier. Вы можете найти пример кода на странице https://developer.android.com/reference/android/net/wifi/WifiNetworkSpecifier.Builder.html#build().

person VIjay J    schedule 23.01.2020
comment
Можно ли подключиться к сети WEP с новым WifiNetWorkSpecifier.Builder? Я не могу найти способ добавить к построителю кодовую фразу WEP. - person Dieter27; 08.04.2020
comment
Номер 1, похоже, не работает, есть ли обратный вызов? - person Faizan Mir; 15.04.2020
comment
№1 тоже не работает, устройство показывает запрос на подключение к сети, но нет подключения к Интернету. Согласно документации: «Эти спецификаторы могут использоваться только для запроса локальной сети Wi-Fi (т. Е. Без возможности подключения к Интернету)». - и я не мог заставить №2 что-либо делать, просто показывает значок Wi-Fi с «?». - person KBog; 16.10.2020

Если ваше устройство знает конфигурации Wi-Fi (уже сохраненные), мы можем обойти ракетостроение. Просто прокрутите конфиги и проверьте, совпадает ли SSID. Если да, подключитесь и вернитесь.

Установите разрешения:

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

Соединять:

    try {
    String ssid = null;
    if (wifi == Wifi.PCAN_WIRELESS_GATEWAY) {
        ssid = AesPrefs.get(AesConst.PCAN_WIRELESS_SSID,
                context.getString(R.string.pcan_wireless_ssid_default));
    } else if (wifi == Wifi.KJ_WIFI) {
        ssid = context.getString(R.string.remote_wifi_ssid_default);
    }

    WifiManager wifiManager = (WifiManager) context.getApplicationContext()
            .getSystemService(Context.WIFI_SERVICE);

    List<WifiConfiguration> wifiConfigurations = wifiManager.getConfiguredNetworks();

    for (WifiConfiguration wifiConfiguration : wifiConfigurations) {
        if (wifiConfiguration.SSID.equals("\"" + ssid + "\"")) {
            wifiManager.enableNetwork(wifiConfiguration.networkId, true);
            Log.i(TAG, "connectToWifi: will enable " + wifiConfiguration.SSID);
            wifiManager.reconnect();
            return null; // return! (sometimes logcat showed me network-entries twice,
            // which may will end in bugs)
        }
    }
} catch (NullPointerException | IllegalStateException e) {
    Log.e(TAG, "connectToWifi: Missing network configuration.");
}
return null;
person Martin Pfeffer    schedule 25.05.2017

Я сломал себе голову, чтобы понять, почему ваши ответы на WPA / WPA2 не работают ... после нескольких часов попыток я нашел то, что вам не хватает:

conf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

ТРЕБУЕТСЯ для сетей WPA !!!!

Теперь все работает :)

person Taras Okunev    schedule 27.07.2017

Это действие, которое вы можете подклассифицировать, чтобы принудительно подключиться к определенному Wi-Fi: https://github.com/zoltanersek/android-wifi-activity/blob/master/app/src/main/java/com/zoltanersek/androidwifiactivity/WifiActivity.java

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

public class SampleActivity extends WifiBaseActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
  }

  @Override
  protected int getSecondsTimeout() {
      return 10;
  }

  @Override
  protected String getWifiSSID() {
      return "WifiNetwork";
  }

  @Override
  protected String getWifiPass() {
      return "123456";
  }
}
person Zoltan Ersek    schedule 26.05.2015
comment
ссылку вниз можешь дать новую? - person StartCoding; 05.10.2018

Тоже пробовал подключиться к сети. Ни одно из предложенных выше решений не работает для hugerock t70. Функция wifiManager.disconnect (); не отключается от текущей сети. И поэтому не может повторно подключиться к указанной сети. Я изменил приведенный выше код. Для меня код bolow отлично работает:

String networkSSID = "test";
String networkPass = "pass";

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

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

int networkId = wifiManager.addNetwork(conf);
wifi_inf = wifiManager.getConnectionInfo();

/////important!!!
wifiManager.disableNetwork(wifi_inf.getNetworkId());
/////////////////

wifiManager.enableNetwork(networkId, true);
person user1277317    schedule 24.09.2018
comment
Я получаю сообщение об ошибке в Android 10: UID nnnnn does not have permission to update configuration xxxx. MD_START_CONNECT but no requests and connected, but app does not have sufficient permissions, bailing. - person Luis A. Florit; 19.04.2020
comment
Спасибо! у меня работал с Alcatel 5041C с Android 8.1. Вы можете видеть, что он отключается от текущего Wi-Fi перед подключением к новому - person save_jeff; 05.12.2020

Попробуйте этот метод. Это очень легко:

public static boolean setSsidAndPassword(Context context, String ssid, String ssidPassword) {
    try {
        WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
        Method getConfigMethod = wifiManager.getClass().getMethod("getWifiApConfiguration");
        WifiConfiguration wifiConfig = (WifiConfiguration) getConfigMethod.invoke(wifiManager);

        wifiConfig.SSID = ssid;
        wifiConfig.preSharedKey = ssidPassword;

        Method setConfigMethod = wifiManager.getClass().getMethod("setWifiApConfiguration", WifiConfiguration.class);
        setConfigMethod.invoke(wifiManager, wifiConfig);

        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}
person Hiren Vaghela    schedule 22.09.2016