Android wifiManager.addNetwork devuelve -1

Estoy escribiendo una aplicación para Android que se conectará a un punto de acceso WPA específico, cuando se conecte, emitirá una llamada http. No guardará la configuración de red. He leído casi todos los mensajes sobre desbordamiento de pila en la conexión a la red wifi, pero no puedo encontrar la respuesta que funciona para mí. Aquí está el código que estoy utilizando para conectar ..

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; } 

Sin embargo netId es siempre -1. Lo he probado en dos teléfonos diferentes (ICS: HTC Rezound y GingerBread: Motorola DroidX). Ambos muestran exactamente los mismos resultados. Qué estoy haciendo mal ?

Edit: He intentado el mismo código con el punto de acceso WPA2 y obtuvo resultados muy extraños. Cuando se ejecutó este código, la primera vez que devolvería -1, pero si llamo al mismo método segunda vez con un retraso de 1 segundo, se devolverá netId válido. Así que las preguntas son

  1. ¿Por qué el código anterior no se conecta a wpa?
  2. En wpa2, ¿por qué necesito llamar al método anterior dos veces para conectarse? Edit: he observado que tuve que conectar varias veces para conectarse. A veces se necesitaría 3-4 veces para conectarse. Por lo tanto, por ahora estoy bucle hasta que la adición de configuración devuelve> 0 id.

Posiblemente un poco tarde, pero pruebe esto para conectarse a las redes protegidas 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); 

Obviamente, establecer sus propias variables para los diferentes tipos de seguridad según corresponda. La clave (perdón del juego de palabras) para conectarse a una red segura WEP es el método getHexKey como se muestra a continuación.

 /** * 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; } 

He encontrado que si la llave compartida es menos de 8 caracteres, volverá -1.

Acabo de tener este mismo problema. Aparentemente todo estaba bien, pero entonces – no lo era.

Lo que encontré es esto:

  • Android WifiStateMachine no te permitirá agregar o modificar redes a menos que suplicante esté funcionando y conectado. Esto afecta a los servicios que se ejecutan en la puesta en marcha y los servicios que se ejecutan incluso si WIFI está apagado.

  • Android WifiConfigStore registra los propietarios de la red wifi por UID. Esto significa que es posible que no pueda modificar la red creada por otro proceso.

La forma correcta de agregar una red es:

  1. Declare el permiso de android.pemissions.OVERRIDE_WIFI_CONFIG en su archivo de manifiesto.
  2. Compruebe si la red WIFI está habilitada. Si no, llame a WifiManager.setWifiEnabled(true) .
  3. Espere hasta que WifiManager.pingSupplicant() devuelva true.
  4. Cree y rellene una nueva WifiConfiguration , luego pase a WifiManager.addNetwork() . Asegúrese de que el valor devuelto no sea (-1).
  5. (Opcional) valor de uso devuelto por addNetwork() como un argumento a la llamada WifiConfiguration.enableNetwork() (a menos que sea -1). Tenga en cuenta que el parámetro booleano significa disableOthers y debe ser false , a menos que tenga derecho a modificar todas las demás redes: puede fallar internamente, si lo configura como true .

Esto debería permitirle agregar (y conectar) de forma programática a una nueva red Wifi.

Yo tuve el mismo problema. Me enteré de que su wifi debe estar encendido mientras que usted está llamando addNetwork.

  • Android / Java cómo saber el tipo de radio de wifi conectado
  • Cómo abrir navegador predeterminado de cautivo en Android
  • wifi.getDhcpInfo () en Android devuelve la puerta de enlace IP incorrecta
  • ¿Puedo cambiar el propietario del grupo en un grupo persistente en Wi-Fi Direct?
  • Cómo comunicarse con la cámara habilitada para wifi
  • Hotspot multiplexado en Android
  • ¿Cómo detectar dispositivos móviles cercanos usando el SDK de Android?
  • Android: ¿Cómo obtener la encriptación Wifi actual?
  • Cómo ejecutar wifi peer to peer aplicación en el emulador de Android ..?
  • Android - No puede eliminar la red Wifi de forma programática El método removeNetwork (int) en el tipo WifiManager no es aplicable a los argumentos (String)
  • Aplicación de mapas personalizados en interiores
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.