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 ?
- Android :: ¿Cómo desconectarse de una red wifi?
- Cómo Wifi y los datos móviles trabajan simultáneamente en android para el dispositivo OBD2
- SecurityException al obtener los resultados de la exploración Wifi
- Instalación / Acceso a Certs para VPN / WIFI mediante programación en Android
- ¿Podemos conectar más de 10 dispositivos con wi-fi hot-spot en Android
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.
- Android verificar el estado WIFI (desconectado o el usuario ha cambiado WIFI) ¿Cómo FLAG?
- ¿Puede Android hacer redes ad-hoc peer-to-peer?
- ¿Cómo obtener la seguridad WiFi (NINGUNA, WEP, WPA, WPA2) de Android WifiConfiguration entrada?
- Descubrimiento del servicio directo Wifi de Android
- ¿Utiliza simultáneamente wifi y la interfaz 3G en Android?
- Cómo y qué establecer en Android WifiConfiguration.preSharedKey para conectarse a la red WPA2 PSK WiFi
- Android: Cómo obtener el dispositivo actual WiFi-nombre directo
- Chat wifi entre dos o más dispositivos 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