2012-05-22 20 views
5

Tôi đang cố tạo các cấu hình WiFi dành cho doanh nghiệp theo chương trình trên Android (WPA-Enterprise, WPA2-Enterprise).Android: Tại sao SDK không cung cấp cho lập trình viên để thêm cấu hình WiFi (EAP) một cách dễ dàng?

Tôi đã thấy một giải pháp khá nổi tiếng, đó là sử dụng sự phản chiếu để đạt được điều này. Theo hiểu biết của tôi, nếu nó phải được thực hiện theo cách gián tiếp liên quan đến việc truy cập vào các phần của một API đã bị từ chối truy cập, thì phải có lý do chính đáng cho nó.

Điều này có nghĩa là Google KHÔNG muốn các nhà phát triển có thể định cấu hình cài đặt Wi-Fi theo lập trình không? Nếu vậy, điều gì có thể là lý do cho điều này?

+0

đâu này 'giải pháp khá nổi tiếng' bạn đã thấy? – jacknad

+0

tại đây http://stackoverflow.com/questions/4374862/how-to-programatically-create-and-read-wep-eap-wifi-configurations-in-android/4375874#4375874 –

Trả lời

0

Có thể tôi đang thiếu điều gì đó trong câu hỏi hoặc trong chi tiết, vì tôi không cần phải tự làm điều này, nhưng các lớp học WifiManagerWifiConfiguration không làm những gì bạn cần? Ví dụ:

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

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

wMan.addNetwork(config); 

EDIT: Câu trả lời bạn chỉ sử dụng phản ánh cho cấu hình EAP (kết nối bằng WPA-Enterprise hoặc WPA2-Enterprise security). Đối với các kết nối điển hình, bạn không cần phải sử dụng sự phản chiếu.

+0

Đó là chính xác. Nhưng yêu cầu của tôi là dành cho Doanh nghiệp. Có lý do tại sao điều này nên được cho phép không cho doanh nghiệp? –

+0

Được rồi, với sự làm rõ đó tôi không chắc chắn sau đó. Tôi không quen thuộc với các mạng EAP nên tôi sẽ để lại câu trả lời cho người khác. :) – kcoppock

+0

Cảm ơn bạn, hãy chia sẻ điều này với ai đó có thể biết câu trả lời? –

1

Tôi đã viết một lớp với một phương pháp tĩnh sẽ cho phép bạn thực hiện việc này. Đây rồi. Bạn sẽ cần phải chuyển SSID, Tên người dùng và Mật khẩu của mình vào phương thức. Có một số tùy chọn khác bạn có thể đặt nếu bạn cần đặt EAP thành TLS hoặc PEAP. Cần lưu ý rằng mã này là cơ sở của mã ở đây: How to programmatically create and read WEP/EAP WiFi configurations in Android?. Sự khác biệt là mã của tôi cho phép bạn điều chỉnh cài đặt cấu hình IP và cài đặt proxy. Sử dụng mã này, bạn có thể tự động kết nối với mạng wifi bằng cài đặt WPA_EAP.

Hope this helps:

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

cảm ơn câu trả lời của bạn. Tôi đã thấy giải pháp này trước đây. Đây không phải là một phương pháp SDK trực tiếp, mà là một sự phản ánh. Các lỗ này có thể bị chặn bởi Google bất kỳ lúc nào. –

+0

Không, không phải SDK, nhưng nó làm việc cho tôi :) – BlackHatSamurai

+0

@HeshanPerera bạn đang viết từ lolipop trên phường những kỹ thuật không hoạt động. Còn cách nào khác không? –

Các vấn đề liên quan