2011-06-29 20 views

Respuesta

30

Pase el SSID y su contraseña al siguiente método.

public void connectToAP(String ssid, String passkey) { 
    Log.i(TAG, "* connectToAP"); 

    WifiConfiguration wifiConfiguration = new WifiConfiguration(); 

    String networkSSID = ssid; 
    String networkPass = passkey; 

    Log.d(TAG, "# password " + networkPass); 

    for (ScanResult result : scanResultList) { 
     if (result.SSID.equals(networkSSID)) { 

      String securityMode = getScanResultSecurity(result); 

      if (securityMode.equalsIgnoreCase("OPEN")) { 

       wifiConfiguration.SSID = "\"" + networkSSID + "\""; 
       wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
       int res = wifiManager.addNetwork(wifiConfiguration); 
       Log.d(TAG, "# add Network returned " + res); 

       boolean b = wifiManager.enableNetwork(res, true); 
       Log.d(TAG, "# enableNetwork returned " + b); 

       wifiManager.setWifiEnabled(true); 

      } else if (securityMode.equalsIgnoreCase("WEP")) { 

       wifiConfiguration.SSID = "\"" + networkSSID + "\""; 
       wifiConfiguration.wepKeys[0] = "\"" + networkPass + "\""; 
       wifiConfiguration.wepTxKeyIndex = 0; 
       wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
       wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 
       int res = wifiManager.addNetwork(wifiConfiguration); 
       Log.d(TAG, "### 1 ### add Network returned " + res); 

       boolean b = wifiManager.enableNetwork(res, true); 
       Log.d(TAG, "# enableNetwork returned " + b); 

       wifiManager.setWifiEnabled(true); 
      } 

      wifiConfiguration.SSID = "\"" + networkSSID + "\""; 
      wifiConfiguration.preSharedKey = "\"" + networkPass + "\""; 
      wifiConfiguration.hiddenSSID = true; 
      wifiConfiguration.status = WifiConfiguration.Status.ENABLED; 
      wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
      wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
      wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
      wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
      wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
      wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
      wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 

      int res = wifiManager.addNetwork(wifiConfiguration); 
      Log.d(TAG, "### 2 ### add Network returned " + res); 

      wifiManager.enableNetwork(res, true); 

      boolean changeHappen = wifiManager.saveConfiguration(); 

      if(res != -1 && changeHappen){ 
       Log.d(TAG, "### Change happen"); 

       AppStaticVar.connectedSsidName = networkSSID; 

      }else{ 
       Log.d(TAG, "*** Change NOT happen"); 
      } 

      wifiManager.setWifiEnabled(true); 
     } 
    } 
} 

public String getScanResultSecurity(ScanResult scanResult) { 
    Log.i(TAG, "* getScanResultSecurity"); 

    final String cap = scanResult.capabilities; 
    final String[] securityModes = { "WEP", "PSK", "EAP" }; 

    for (int i = securityModes.length - 1; i >= 0; i--) { 
     if (cap.contains(securityModes[i])) { 
      return securityModes[i]; 
     } 
    } 

    return "OPEN"; 
} 

No olvide agregar el permiso necesario en el archivo de Manifest.

+3

este código no compila, wh ¿Se definen las variables scanResultList y wifiManager? – yoprogramo

+0

Deberá obtener WifiManager wifiManager (Context.getSystemService (Context.WIFI_SERVICE)) y hacer una llamada en él (wifiMananger.getScanResults()) para obtener la variable scanResultList. El código anterior supone que ya tiene una lista de redes disponibles. – wblaschko

+2

¿Qué es AppStaticVar en su código? –

2

El código publicado desde AnujAroshA aquí es realmente útil. Pero falta un otro caso:

.. 
    } else if (securityMode.equalsIgnoreCase("PSK")) { 
    // PSK code 
    .. 

De lo contrario, el código PSK también se ejecuta para las redes WEP y OPEN.

Y el estilo del código no es óptimo en mi opinión. No es necesario crear los dos Strings networkSSID y networkPass. Simplemente puede usar ssid o passkey.

Sugerencia: Dividir creando la configuración wifi y el método de conexión.

(1) Método de creación de la WifiConfiguration:

private WifiConfiguration createAPConfiguration(String networkSSID, String networkPasskey, String securityMode) { 
     WifiConfiguration wifiConfiguration = new WifiConfiguration(); 

     wifiConfiguration.SSID = "\"" + networkSSID + "\""; 

     if (securityMode.equalsIgnoreCase("OPEN")) { 

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

     } else if (securityMode.equalsIgnoreCase("WEP")) { 

      wifiConfiguration.wepKeys[0] = "\"" + networkPasskey + "\""; 
      wifiConfiguration.wepTxKeyIndex = 0; 
      wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
      wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 

     } else if (securityMode.equalsIgnoreCase("PSK")) { 

      wifiConfiguration.preSharedKey = "\"" + networkPasskey + "\""; 
      wifiConfiguration.hiddenSSID = true; 
      wifiConfiguration.status = WifiConfiguration.Status.ENABLED; 
      wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
      wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
      wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
      wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
      wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
      wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
      wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 

     } else { 
      Log.i(TAG, "# Unsupported security mode: "+securityMode); 

      return null; 
     } 

     return wifiConfiguration; 

    } 

(2) Método para la AP conectar: ​​

public int connectToAP(String networkSSID, String networkPasskey) { 
    for (ScanResult result : scanResultList) { 

     if (result.SSID.equals(networkSSID)) { 

      String securityMode = getScanResultSecurity(result); 

      WifiConfiguration wifiConfiguration = createAPConfiguration(networkSSID, networkPasskey, securityMode); 

      int res = wifiManager.addNetwork(wifiConfiguration); 
      Log.d(TAG, "# addNetwork returned " + res); 

      boolean b = wifiManager.enableNetwork(res, true); 
      Log.d(TAG, "# enableNetwork returned " + b); 

      wifiManager.setWifiEnabled(true); 

      boolean changeHappen = wifiManager.saveConfiguration(); 

      if (res != -1 && changeHappen) { 
       Log.d(TAG, "# Change happen"); 
       connectedSsidName = networkSSID; 
      } else { 
       Log.d(TAG, "# Change NOT happen"); 
      } 

      return res; 
     } 
    } 

    return -1; 
} 

(3) El Método de escaneado 100% como publicado AnujAroshA.

public String getScanResultSecurity(ScanResult scanResult) { 

    final String cap = scanResult.capabilities; 
    final String[] securityModes = { "WEP", "PSK", "EAP" }; 

    for (int i = securityModes.length - 1; i >= 0; i--) { 
     if (cap.contains(securityModes[i])) { 
      return securityModes[i]; 
     } 
    } 

    return "OPEN"; 
} 
4

100% Funciona.

De esta manera se puede conectar a su WIF específica Este código de MainActivity.java

////////////// >>> Conexión WiFi (WP2) < < < ////////////////

 WifiConfiguration wifiConfig = new WifiConfiguration(); 

     wifiConfig.SSID = String.format("\"%s\"", "Wifi name"); 
     wifiConfig.preSharedKey = String.format("\"%s\"", "Wifi password"); 

     WifiManager wifiManager=(WifiManager)getSystemService(WIFI_SERVICE); 
     int netId = wifiManager.addNetwork(wifiConfig); 
     wifiManager.disconnect(); 
     wifiManager.enableNetwork(netId, true); 
     wifiManager.reconnect(); 

y también no se olvide de incluir este código a su AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
Cuestiones relacionadas