2012-10-08 16 views
13

Uso il seguente codice per connettersi a reti crittografate. Tuttavia se una rete non è protetta e lascio la chiave vuota (""), fallisce. Qualcuno ha un'idea di come risolvere questo? Inoltre è possibile rilevare se una rete è aperta usando ssid/bssid? O devo scannerizzare con un filtro?Connect to 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(); 
} 

risposta

12

Usa

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

solo e funzionerà.

rimuovere tutti gli altri incarichi a wc, non è necessario utilizzarli per una semplice attività di connessione a una rete. Non sei una rete creating, ti stai collegando a uno existing.

Per la soluzione completa, controllare questo collegamento: How do I connect to a specific Wi-Fi network in Android programmatically? Ha tutto ciò che è necessario sapere.

+0

Avete qualche codice su come ottenere il metodo di crittografia da * solo * ssid? – bluewhile

+2

No. Non è possibile trovare il metodo di crittografia solo da ssid. È necessario cercare reti, quindi utilizzare ScanResult per ottenere tutte le reti disponibili. Quindi cerca la tua rete con il dato ssid e trova il suo metodo di crittografia. Ecco un link: http://stackoverflow.com/a/12747455/1117338 e http://developer.android.com/reference/android/net/wifi/ScanResult.html#capabilities –