2012-05-22 5 views
5

Próbuję programowo tworzyć profile Wi-Fi przedsiębiorstwa na Androidzie (WPA-Enterprise, WPA2-Enterprise).Android: Dlaczego SDK nie zapewnia programistom łatwego dodawania profili Wi-Fi (EAP)?

Widziałem dość znane rozwiązanie, które polega na użyciu refleksji w celu osiągnięcia tego. Według mojego rozumowania, jeśli musi to być zrobione w taki pośredni sposób, który wiąże się z uzyskaniem dostępu do części API, do których odmówiono dostępu, musi istnieć ku temu dobry powód.

Czy to oznacza, że ​​Google NIE chce, aby programiści mogli programowo konfigurować ustawienia Wi-Fi? Jeśli tak, jaki może być tego powód?

+0

Gdzie jest to 'dość znanym rozwiązaniem' Widziałeś? – jacknad

+0

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

Odpowiedz

0

Być może brakuje mi czegoś w pytaniu lub w szczegółach, ponieważ sam nie miałem takiej potrzeby, ale czy klasy WifiManager i WifiConfiguration nie robią tego, czego potrzebujesz? Na przykład:

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

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

wMan.addNetwork(config); 

EDIT: Odpowiedź pan wskazał używa tylko odbicie EAP (dla konfiguracji połączeń z wykorzystaniem WPA-Enterprise lub WPA2-Enterprise Security, zazwyczaj). W przypadku typowych połączeń nie powinieneś używać odbicia.

+0

To prawda. Ale moim wymaganiem jest Enterprise. Czy istnieje powód, dla którego powinno to być zabronione dla przedsiębiorstw? –

+0

Dobra, z tym wyjaśnieniem nie jestem wtedy pewien. Nie jestem szczególnie zaznajomiony z sieciami EAP, więc zostawię tę odpowiedź komuś innemu. :) – kcoppock

+0

Dziękuję, proszę podziel się tym z kimś, kto może znać odpowiedź? –

1

Napisałem klasę metodą statyczną, która pozwoli ci to zrobić. Oto jest. Będziesz musiał podać swój identyfikator SSID, nazwę użytkownika i hasło do metody. Istnieje kilka innych opcji, które możesz ustawić, jeśli chcesz ustawić EAP na TLS lub PEAP. Należy zauważyć, że ten kod jest oparty na kodzie tutaj: How to programmatically create and read WEP/EAP WiFi configurations in Android?. Różnica polega na tym, że mój kod pozwala dostosować ustawienia konfiguracji IP i ustawienia proxy. Za pomocą tego kodu można automatycznie łączyć się z siecią Wi-Fi z ustawieniami WPA_EAP.

Nadzieja to pomaga:

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

dzięki za odpowiedź. Widziałem już to rozwiązanie. To nie jest bezpośrednia metoda SDK, ale raczej odbicie hackowe. Te dziury mogą zostać zablokowane przez Google w dowolnym momencie. –

+0

Nie, nie SDK, ale zadziałało to dla mnie :) – BlackHatSamurai

+0

@HeshanPerera piszesz od lolipop na oddziałach, które nie działają. czy jest jakiś inny sposób? –

Powiązane problemy