2012-10-08 16 views
13

Utilizo el siguiente código para conectarme a redes encriptadas. Sin embargo, si una red no está protegida y dejo la llave vacía (""), falla. ¿Alguien tiene una idea de cómo resolver esto? Además, ¿es posible detectar si una red está abierta usando el ssid/bssid? ¿O debo escanear con un filtro?Conectar a Open WiFi

public void connectToSSID(final String ssid, final String key) { 
    Log.i("wifimaster", "connection to "+ssid); 

    WifiConfiguration wc = new WifiConfiguration(); 
    wc.SSID = "\""+ssid+"\""; //IMPORTANT! This should be in Quotes!! 
    wc.priority = 40; 
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
    wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
    wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 
    wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 
    wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); 
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); 
    wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); 
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 

    wc.preSharedKey = "\""+key+"\""; 
    wc.wepKeys[0] = "\""+key+"\""; //This is the WEP Password 
    wc.wepTxKeyIndex = 0; 

    wc.preSharedKey = "\""+key+"\""; 

    int res = wifiManager.addNetwork(wc); 
    Log.d("WifiPreference", "add Network returned " + res); 
    boolean es = wifiManager.saveConfiguration(); 
    Log.d("WifiPreference", "saveConfiguration returned " + es); 
    boolean b = wifiManager.enableNetwork(res, true); 
    Log.d("WifiPreference", "enableNetwork returned " + b); 

    if(b) 
     Toast.makeText(c, c.getString(R.string.connected), Toast.LENGTH_SHORT).show(); 
    else 
     Toast.makeText(c, c.getString(R.string.unconnected), Toast.LENGTH_SHORT).show(); 
} 

Respuesta

12

Uso

wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 

solamente y que va a funcionar.

elimina todas las demás asignaciones al wc, no es necesario utilizarlas para una tarea sencilla de conexión a una red. Usted no es creating una red, se está conectando a una existing.

Para una solución completa, consulte este enlace: How do I connect to a specific Wi-Fi network in Android programmatically? Tiene todo lo que necesita saber.

+0

¿Tiene algún código sobre cómo obtener el método de encriptación de * solo * el sid? – bluewhile

+2

No. No puede encontrar el método de encriptación solo desde el ssid. Debe escanear en busca de redes y luego usar ScanResult para obtener todas las redes disponibles. Luego busca tu red con el ssid dado y encuentra su método de encriptación. Aquí hay un enlace: http://stackoverflow.com/a/12747455/1117338 y http://developer.android.com/reference/android/net/wifi/ScanResult.html#capabilities –