Android wifiManager.addNetwork возвращает -1

Я пишу приложение Android, которое будет подключаться к определенной точке доступа WPA, при подключении он выдает HTTP-вызов. Он не сохранит конфигурацию сети. Я прочитал почти все сообщения о переполнении стека при подключении к Wi-Fi сети, но не могу найти ответ, который работает для меня. Вот код, который я использую для подключения.

WifiConfiguration wc = new WifiConfiguration(); wc.allowedAuthAlgorithms.clear(); wc.allowedGroupCiphers.clear(); wc.allowedPairwiseCiphers.clear(); wc.allowedProtocols.clear(); wc.allowedKeyManagement.clear(); wc.SSID = "\"".concat("<ssid>").concat("\""); wc.preSharedKey = "\"".concat("<password>").concat("\""); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // For WPA2 wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // For WPA wc.priority = 0; //wc.hiddenSSID = true; wc.status = WifiConfiguration.Status.ENABLED; // connect to and enable the connection WifiManager wifiManager = (WifiManager) getSystemService(this.WIFI_SERVICE); int netId = wifiManager.addNetwork(wc); boolean wifiEnabled = wifiManager.enableNetwork(netId, true); wifiManager.setWifiEnabled(true); Log.d("opener", "addNetwork returned " + netId); if (netId > 0) { wifiId = netId; } 

Однако netId всегда -1. Я пробовал это на двух разных телефонах (ICS: HTC Rezound и GingerBread: Motorola DroidX). Оба показывают точно такие же результаты. Что я делаю не так ?

Изменить: я пробовал использовать тот же код с точкой доступа WPA2 и получал очень странные результаты. Когда этот код был запущен, первый раз он будет возвращать -1, но если я вызову тот же метод второй раз с задержкой в ​​1 секунду, он вернет действительный netId. Поэтому вопросы

  1. Почему код выше не подключается к wpa?
  2. В wpa2, почему мне нужно дважды вызвать метод выше, чтобы подключиться? Редактирование: я заметил, что мне нужно было подключиться несколько раз, чтобы подключиться. Иногда для подключения требуется 3-4 раза. Так что пока я зацикливаюсь до добавления config возвращает> 0 id.

Solutions Collecting From Web of "Android wifiManager.addNetwork возвращает -1"

Возможно, немного поздно, но попробуйте подключиться к защищенным сетям Open / WPA / WPA2 / WEP

  WifiConfiguration wifiConfig = new WifiConfiguration(); wifiConfig.SSID = selectedNetwork.SSID(); wifiConfig.status = WifiConfiguration.Status.DISABLED; wifiConfig.priority = 40; // Dependent on the security type of the selected network // we set the security settings for the configuration if (/*Open network*/) { // No security wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wifiConfig.allowedAuthAlgorithms.clear(); wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); } else if (/*WPA*/ || /*WPA2*/) { //WPA/WPA2 Security wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); wifiConfig.preSharedKey = "\"".concat(password).concat("\""); } else if (/*WEP*/) { // WEP Security wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); if (getHexKey(password)) wifiConfig.wepKeys[0] = password; else wifiConfig.wepKeys[0] = "\"".concat(password).concat("\""); wifiConfig.wepTxKeyIndex = 0; } // Finally we add the new configuration to the managed list of networks int networkID = wifiMan.addNetwork(wifiConfig); 

Очевидно, вы установите свои собственные переменные для разных типов безопасности, если это применимо. Ключ (pardon the pun) к подключению к защищенной сети WEP – это метод getHexKey, как показано ниже.

 /** * WEP has two kinds of password, a hex value that specifies the key or * a character string used to generate the real hex. This checks what kind of * password has been supplied. The checks correspond to WEP40, WEP104 & WEP232 * @param s * @return */ private static boolean getHexKey(String s) { if (s == null) { return false; } int len = s.length(); if (len != 10 && len != 26 && len != 58) { return false; } for (int i = 0; i < len; ++i) { char c = s.charAt(i); if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) { continue; } return false; } return true; } 

Я обнаружил, что если общий ключ меньше 8 символов, он вернет -1.

У меня была такая же проблема. Кажется, все было хорошо, но потом – это не так.

Я нашел следующее:

  • Android WifiStateMachine не позволит вам добавлять или изменять сети, если проситель не работает и не подключен. Это влияет на службы, запущенные при запуске и запуске служб, даже если WIFI отключен.

  • Android WifiConfigStore отслеживает владельцев Wi-Fi сети по UID. Это означает, что вы не сможете изменить сеть, созданную другим процессом.

Правильный способ добавления сети:

  1. android.pemissions.OVERRIDE_WIFI_CONFIG разрешение android.pemissions.OVERRIDE_WIFI_CONFIG в файле манифеста.
  2. Проверьте, включена ли сеть WIFI. Если нет, вызовите WifiManager.setWifiEnabled(true) .
  3. Подождите, пока WifiManager.pingSupplicant() вернет true.
  4. Создайте и заполните новую WifiConfiguration , а затем передайте ее WifiManager.addNetwork() . Убедитесь, что возвращаемое значение не является (-1).
  5. (Необязательно) использовать значение, возвращаемое addNetwork() в качестве аргумента для WifiConfiguration.enableNetwork() (если оно не WifiConfiguration.enableNetwork() -1). Обратите внимание, что логический параметр означает disableOthers и должен быть ложным , если у вас нет права изменять все другие сети: он может выйти из строя внутренне, если вы установите его в true .

Это должно позволить вам добавлять (и подключаться) программно к новой сети Wi-Fi.

У меня такая же проблема. Я узнал, что ваш Wi-Fi должен быть включен, когда вы вызываете addNetwork.