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 ?
- esperar hasta que el wifi esté conectado en android
- Cómo recibir ICS Wi-Fi hotspot enale / disable vía broadcastreceiver
- Escaneado Wi-Fi sin receptor de difusión?
- Cómo deshabilitar la conexión automática WIFI en Android
- Construir una configuración Wifi desde un ScanResult o: Interpretar la cadena 'capabilities' de ScanResult
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
- ¿Por qué el código anterior no se conecta a wpa?
- 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.
- Instalación / Acceso a Certs para VPN / WIFI mediante programación en Android
- Escuchando en un puerto específico para los datos entrantes
- Android activar / desactivar WiFi HotSpot mediante programación
- ¿Cómo mantenerse conectado a través de la red móvil después de que WIFI esté conectado en Android?
- Establecer proxy WiFi sin rooting teléfono
- Problemas con el script wifi de Android
- Compartir credenciales Wifi a través de etiqueta NFC sin aplicaciones especiales
- Cómo crear y leer configuraciones WEP / EAP WiFi de forma programática en Android?
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:
- Declare el permiso de
android.pemissions.OVERRIDE_WIFI_CONFIG
en su archivo de manifiesto. - Compruebe si la red WIFI está habilitada. Si no, llame a
WifiManager.setWifiEnabled(true)
. - Espere hasta que
WifiManager.pingSupplicant()
devuelva true. - Cree y rellene una nueva
WifiConfiguration
, luego pase aWifiManager.addNetwork()
. Asegúrese de que el valor devuelto no sea (-1). - (Opcional) valor de uso devuelto por
addNetwork()
como un argumento a la llamadaWifiConfiguration.enableNetwork()
(a menos que sea -1). Tenga en cuenta que el parámetro booleano significadisableOthers
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.
- ERROR: redimensionar la partición e2fsck falló con el código de salida 8
- Android: cómo seleccionar textos de la vista web