2012-05-22 5 views
5

Sto provando a creare a livello di programmazione profili WiFi aziendali su Android (WPA-Enterprise, WPA2-Enterprise).Android: perché l'SDK non prevede che il programmatore aggiunga facilmente i profili WiFi (EAP)?

Ho visto una soluzione abbastanza famosa, che è quella di utilizzare la riflessione per raggiungere questo obiettivo. A mio avviso, se deve essere fatto in modo indiretto che comporta l'accesso a parti di un'API a cui è stato negato l'accesso, ci deve essere una buona ragione per farlo.

Ciò significa che Google NON vuole che gli sviluppatori siano in grado di configurare programmaticamente le impostazioni WiFi? Se sì, quale potrebbe essere la ragione di questo?

+0

Dove si trova questa 'soluzione abbastanza famoso' avete visto? – jacknad

+0

qui http://stackoverflow.com/questions/4374862/how-to-programatically-create-and-read-wep-eap-wifi-configurations-in-android/4375874#4375874 –

risposta

0

Forse mi manca qualcosa nella domanda o nei dettagli, in quanto non ho avuto bisogno di farlo da solo, ma le classi WifiManager e WifiConfiguration non fanno quello che ti serve? Per esempio:

WifiManager wMan = getSystemService(Context.WIFI_SERVICE); 
WifiConfiguration config = new WifiConfiguration(); 

config.SSID = "your ssid"; 
//continue setting up the configuration 

wMan.addNetwork(config); 

EDIT: La risposta che indicò utilizza solo di riflessione per le configurazioni EAP (connessioni che utilizzano WPA-Enterprise o WPA2-Enterprise di sicurezza, in genere). Per le connessioni tipiche, non è necessario utilizzare la riflessione.

+0

Ciò è corretto. Ma il mio requisito è per l'Enterprise. C'è una ragione per cui questo dovrebbe essere disabilitato per le imprese? –

+0

Ok, con quel chiarimento non sono sicuro allora. Non ho molta familiarità con le reti EAP, quindi lascerò la risposta a qualcun altro. :) – kcoppock

+0

Grazie, per favore, condividilo con qualcuno che potrebbe conoscere la risposta? –

1

Ho scritto una classe con un metodo statico che ti consentirà di farlo. Ecco qui. Dovrai passare il tuo SSID, Username e Password nel metodo. Esistono altre opzioni che è possibile impostare se è necessario impostare EAP su TLS o PEAP. Va notato che questo codice è base off del codice qui: How to programmatically create and read WEP/EAP WiFi configurations in Android?. La differenza è che il mio codice consente di regolare le impostazioni di configurazione IP e le impostazioni del proxy. Utilizzando questo codice è possibile connettersi automaticamente a una rete Wi-Fi con le impostazioni WPA_EAP.

Spero che questo aiuti:

import java.lang.reflect.Field; 
import java.lang.reflect.Method; 

import android.net.wifi.WifiConfiguration; 
import android.util.Log; 

public class WPAConfiguration { 

    private static final String INT_PRIVATE_KEY = "private_key"; 
    private static final String INT_PHASE2 = "phase2"; 
    private static final String INT_PASSWORD = "password"; 
    private static final String INT_IDENTITY = "identity"; 
    private static final String INT_EAP = "eap"; 
    private static final String INT_CLIENT_CERT = "client_cert"; 
    private static final String INT_CA_CERT = "ca_cert"; 
    private static final String INT_ANONYMOUS_IDENTITY = "anonymous_identity"; 
    private static final String INT_ENTERPRISEFIELD_NAME = "android.net.wifi.WifiConfiguration$EnterpriseField"; 
    private static final String INT_IPASSIGNMENT_NAME = "android.net.wifi.WifiConfiguration$IpAssignment"; 
    private static final String INT_PROXYSETTINGS_NAME = "android.net.wifi.WifiConfiguration$ProxySettings"; 
    //change this to TLS,PEAP, or other options that are listed when you connect via a device 
    private static final String ENTERPRISE_EAP = "PEAP"; 
    private static final String INT_IP_ASSIGNMENT = "ipAssignment"; 
    private static final String INT_PROXY_SETTINGS = "proxySettings"; 


    public static WifiConfiguration setWifiConfigurations(WifiConfiguration wifiConfig, String SSID, String userName, String userPass) 
    { 
     /*define basic configuration settings*/ 

     /*Access Point*/ 
     wifiConfig.SSID = SSID; 
     wifiConfig.networkId = 0; 

     /*Priority*/ 
     wifiConfig.priority = 0; 

     /*Enable Hidden SSID's*/ 
     wifiConfig.hiddenSSID = false; 

     /*Key Management*/ 
     wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X); 
     wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); 

     /*Set Group Ciphers*/ 

     wifiConfig.allowedGroupCiphers.clear(); 
     wifiConfig.allowedGroupCiphers.clear(); 
     wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
     wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
     wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); 
     wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 


     /*Set Pairwise Ciphers*/ 

     wifiConfig.allowedPairwiseCiphers.clear(); 
     wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
     wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 

     /*Set Protocols*/ 

     wifiConfig.allowedProtocols.clear(); 
     wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
     wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 


     /*Set Enterprise Settings Using Reflection*/ 
     try 
     { 
      Class<?> wifiEnterpriseField = null; 
      Class<?> wifiIpAssignmentField = null; 
      Class<?> wifiProxySettingsField = null; 

      boolean enterpriseFieldType = true; 
      boolean ipAssignmentFieldType = true; 
      boolean proxySettingsFieldType = true; 

      Field anonymousId = null, caCert = null, clientCert = null, eap = null, identity = null, password = null, phase2 = null, privateKey = null, ipAssignment = null, proxy = null; 

      Method setValue = null; 

      Class<?>[] wifiClasses = WifiConfiguration.class.getClasses(); 

      /*Get Enterprise/IP Assignment/Proxy Setting Field Class to Modify*/ 
      for(Class<?> wifiClass : wifiClasses) 
      { 
       if(wifiClass.getName().equals(INT_ENTERPRISEFIELD_NAME)) 
       { 
        wifiEnterpriseField = wifiClass; 
       } 
       else if(wifiClass.getName().equals(INT_IPASSIGNMENT_NAME)) 
       { 
        wifiIpAssignmentField = wifiClass; 
       } 
       else if(wifiClass.getName().equals(INT_PROXYSETTINGS_NAME)) 
       { 
        wifiProxySettingsField = wifiClass; 
       } 
      } 

      /*Certain OS (Cupcake & Doughnut) access the enterprise field directly*/ 
      if(wifiEnterpriseField == null) 
      { 
       enterpriseFieldType = false; 
      } 
      if(wifiIpAssignmentField == null) 
      { 
       ipAssignmentFieldType = false; 
      } 
      if(wifiProxySettingsField == null) 
      { 
       proxySettingsFieldType = false; 
      } 

      /*Get Fields*/ 
      Log.d("Enterprise Setting", "Getting Fields "); 
      Field[] wifiFields = WifiConfiguration.class.getFields(); 
      for(Field wifiField : wifiFields) 
      { 
       if(wifiField.getName().equals(INT_ANONYMOUS_IDENTITY)) 
       { 
        anonymousId = wifiField; 
        Log.d("Enterprise Setting", "Getting Field: " + wifiField); 
       } 
       else if(wifiField.getName().equals(INT_CA_CERT)) 
       { 
        caCert = wifiField; 
        Log.d("Enterprise Setting", "Getting Field: " + wifiField); 
       } 
       else if(wifiField.getName().equals(INT_CLIENT_CERT)) 
       { 
        clientCert = wifiField; 
        Log.d("Enterprise Setting", "Getting Field: " + wifiField); 
       } 
       else if(wifiField.getName().equals(INT_EAP)) 
       { 
        eap = wifiField; 
        Log.d("Enterprise Setting", "Getting Field: " + wifiField); 
       } 
       else if(wifiField.getName().equals(INT_IDENTITY)) 
       { 
        identity = wifiField; 
        Log.d("Enterprise Setting", "Getting Field: " + wifiField); 
       } 
       else if(wifiField.getName().equals(INT_PASSWORD)) 
       { 
        password = wifiField; 
        Log.d("Enterprise Setting", "Getting Field: " + wifiField); 
       } 
       else if(wifiField.getName().equals(INT_PHASE2)) 
       { 
        phase2 = wifiField; 
        Log.d("Enterprise Setting", "Getting Field: " + wifiField); 
       } 
       else if(wifiField.getName().equals(INT_PRIVATE_KEY)) 
       { 
        privateKey = wifiField; 
        Log.d("Enterprise Setting", "Getting Field: " + wifiField); 
       } 
       else if(wifiField.getName().equals(INT_IP_ASSIGNMENT)) 
       { 
        ipAssignment = wifiField; 
        Log.d("Enterprise Setting", "Getting Field: " + wifiField); 
       } 
       else if(wifiField.getName().equals(INT_PROXY_SETTINGS)) 
       { 
        proxy = wifiField; 
        Log.d("Enterprise Setting", "Getting Field: " + wifiField); 
       } 

      } 

      /*Get method to set value of enterprise fields*/ 
      if(enterpriseFieldType) 
      { 
       for(Method method : wifiEnterpriseField.getMethods()) 
       { 
        Log.d("Get Methods", "Enterprise Method: " + method); 
        if(method.getName().trim().equals("setValue")) 
        { 
         setValue = method; 
         break; 
        } 
       } 
      } 

      /*Set EAP*/ 
      if(enterpriseFieldType) 
      { 
       setValue.invoke(eap.get(wifiConfig), ENTERPRISE_EAP); 
       Log.d("Enterprise Setting", "Setting " + ENTERPRISE_EAP); 
      } 
      else 
      { 
       eap.set(wifiConfig, ENTERPRISE_EAP); 
      } 

      /*Set Identity*/ 
      if(enterpriseFieldType) 
      { 
       setValue.invoke(identity.get(wifiConfig), userName); 
       Log.d("Enterprise Setting", "Setting " + userName); 
      } 
      else 
      { 
       identity.set(wifiConfig, userName); 
      } 

      /*Set user password*/ 
      if(enterpriseFieldType) 
      { 
       setValue.invoke(password.get(wifiConfig), userPass); 
       Log.d("Enterprise Setting", "Setting " + userPass); 
      } 
      else 
      { 
       password.set(wifiConfig, userPass); 
      } 

      /*Set IP Protocol*/ 
      if(ipAssignmentFieldType) 
      { 
       /*Change the literal string in here to change the value of obtaining and IP address*/ 
       ipAssignment.set(wifiConfig, Enum.valueOf((Class<Enum>) ipAssignment.getType().asSubclass(Enum.class), "DHCP")); 
       Log.d("Enterprise Setting", "Setting " + ipAssignment); 
      } 
      else 
      { 
       ipAssignment.set(wifiConfig, "DHCP"); 
      } 

      /*Set Proxy Protocol*/ 
      if(proxySettingsFieldType) 
      { 
       /*Change the literal string in here to change the value of proxy settingss*/ 
       proxy.set(wifiConfig, Enum.valueOf((Class<Enum>) proxy.getType().asSubclass(Enum.class), "NONE")); 
       Log.d("Enterprise Setting", "Setting " + proxy); 
      } 
      else 
      { 
       proxy.set(wifiConfig, "NONE"); 
      } 

     } 
     catch(Exception e) 
     { 
      Log.e("ERROR!!!", "Error: " + e); 

     } 
     Log.d("WIFI", "Configuration Settings " + wifiConfig.toString()); 
     return wifiConfig; 
    } 
} 
+0

grazie per la tua risposta. Ho visto questa soluzione prima. Questo non è un metodo SDK diretto, ma piuttosto un hack di riflessione. Questi buchi possono essere bloccati da Google in qualsiasi momento. –

+0

No, non SDK, ma ha funzionato per me :) – BlackHatSamurai

+0

@HeshanPerera si scrive da lolipop in direzione di quelle tecniche non funzionanti. c'è qualche altro modo? –

Problemi correlati