Estoy escribiendo una aplicación para android que se conecta a un determinado punto de acceso WPA, cuando se conecta, se emitirá una llamada http. No guardar la configuración de red.
He leído casi todos los post sobre el desbordamiento de la pila sobre la conexión a la red wifi pero no puede encontrar la respuesta que funciona para mí. Aquí es 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 pan de Jengibre:Motorola DroidX). Ambos muestran exactamente los mismos resultados.
¿Qué estoy haciendo mal?

Edit: he intentado mismo código con WPA2 punto de acceso y se puso muy raro resultados. Cuando este código se ejecute, primera vez que iba a devolver -1, pero si me llaman mismo método segundo tiempo con un retardo de 1 segundo, se volverían válido netId. Así, las preguntas son

  1. ¿por qué el código anterior no se conecta a wpa ?
  2. en wpa2, ¿por qué tengo que llamar a método anterior dos veces para obtener conectado ? Edit: he observado que tenía que conectar varias veces para obtener conectado. A veces podría tomar 3-4 veces a conectar. Así que por ahora estoy en bucle hasta que agregar config devuelve >0 id.
¿La figura? Estoy teniendo exactamente el mismo problema…
Estoy teniendo problemas similares. Mi addNetwork error de llamadas con -1. ¿Alguien resolver esto todavía?

OriginalEl autor Mukesh Aggarwal | 2012-08-18

4 Comentarios

  1. 13

    Posiblemente, un poco tarde pero intenta esto a conectar para Abrir/WPA/WPA2/WEP de redes seguras

        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 aplicables. La clave (perdón por el juego de palabras) para la conexión a una WEP red segura es la getHexKey método como el siguiente.

    /**
    * 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;
    }
    usted no necesita RSN, WPA, TKIP y CCMP y para WEP, derecho?
    En mis pruebas, para redes abiertas sólo el wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); parte de las necesidades a ser llamado.

    OriginalEl autor Mark OB

  2. 8

    He encontrado que si la clave compartida es de menos de 8 caracteres, devuelve -1.

    tienes razón también he encontrado esto depende de la longitud de modo que ¿sabe la solución?

    OriginalEl autor Eric Woodruff

  3. 4

    Yo tenía el mismo problema. Me enteré de que el wi-fi debe estar en mientras que usted está llamando addNetwork.

    usted puede usar esto en los comentarios

    OriginalEl autor clovicek

  4. 4

    Yo tuve el mismo problema. Aparentemente todo estaba bien, pero entonces no lo era.

    Lo que he encontrado es este:

    • Android WifiStateMachine no permiten agregar o modificar redes, a menos que suplicante está encendido y conectado a. Esto afecta a los servicios que se ejecutan en el inicio y la ejecución de servicios, incluso si el WIFI está apagado.

    • Android WifiConfigStore pistas de los propietarios de la red wifi por UID. Esto significa que usted no puede ser capaz de modificar la red creada por otro proceso.

    La forma correcta de agregar una red es:

    1. Comprobar si la red inalámbrica está habilitada. Si no, llame a WifiManager.setWifiEnabled(true).
    2. Esperar hasta WifiManager.pingSupplicant() devuelve true.
    3. Crear y llenar un nuevo WifiConfiguration, a continuación, pasar a WifiManager.addNetwork(). Asegúrese de que el valor devuelto no es (-1).
    4. (opcional) utilice el valor devuelto por addNetwork() como un argumento a WifiConfiguration.enableNetwork() llame al (a menos que sea -1). Tenga en cuenta que el parámetro booleano significa disableOthers y debe ser falso, a menos que usted tenga el derecho de modificar todas las otras redes: es posible que no internamente, si se establece un verdadero.

    Esto debería permitir que usted agregue (y conectar) mediante programación a una nueva red Wifi.

    No puedo encontrar ninguna mención de la android.pemissions.OVERRIDE_WIFI_CONFIG-permiso en cualquier lugar de los documentos o la totalidad de internet. Usted puede elaborar en donde?
    no hay tal cosa como android.permission.OVERRIDE_WIFI_CONFIG.
    He actualizado la respuesta a quitar el obviamente-línea incorrecta sobre el permiso.

    OriginalEl autor Tomasz W

Dejar respuesta

Please enter your comment!
Please enter your name here