2012-05-22 7 views
5

मैं एंड्रॉइड (WPA-Enterprise, WPA2-Enterprise) पर प्रोग्रामेटिक रूप से एंटरप्राइज़ वाईफाई प्रोफाइल बनाने की कोशिश कर रहा हूं।एंड्रॉइड: एसडीके प्रोग्रामर के लिए आसानी से वाईफाई प्रोफाइल (ईएपी) जोड़ने के लिए क्यों नहीं प्रदान करता है?

मैंने एक काफी प्रसिद्ध समाधान देखा है, जो इसे प्राप्त करने के लिए प्रतिबिंब का उपयोग करना है। मेरी समझ के लिए, अगर इसे इस तरह के अप्रत्यक्ष तरीके से किया जाना है जिसमें किसी एपीआई के उन हिस्सों तक पहुंच प्राप्त करना शामिल है जिन्हें एक्सेस से वंचित कर दिया गया है, तो इसके लिए एक अच्छा कारण होना चाहिए।

क्या इसका मतलब यह है कि Google नहीं चाहता कि डेवलपर्स वाईफाई सेटिंग्स को प्रोग्रामेटिक रूप से कॉन्फ़िगर करने में सक्षम हों? यदि हां, तो इसका कारण क्या हो सकता है?

+0

जहां इस 'काफी मशहूर समाधान' आपने देखा है? – jacknad

+0

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

उत्तर

0

शायद मुझे प्रश्न में या विवरण में कुछ याद आ रहा है, क्योंकि मुझे इसे स्वयं करने की आवश्यकता नहीं है, लेकिन WifiManager और WifiConfiguration कक्षाएं आपको जो चाहिए वह नहीं करते हैं? उदाहरण के लिए:

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

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

wMan.addNetwork(config); 

संपादित करें: इस सवाल का जवाब आप की ओर इशारा केवल ईएपी विन्यास (WPA-उद्यम या WPA2-Enterprise सुरक्षा का उपयोग, आम तौर पर कनेक्शन) के लिए प्रतिबिंब का उपयोग करता है। ठेठ कनेक्शन के लिए, आपको प्रतिबिंब का उपयोग नहीं करना चाहिए।

+0

यह सही है। लेकिन मेरी आवश्यकता उद्यम के लिए है। क्या ऐसा कोई कारण है कि इसे उद्यम के लिए अनुमति क्यों दी जानी चाहिए? –

+0

ठीक है, उस स्पष्टीकरण के साथ मुझे यकीन नहीं है। मैं ईएपी नेटवर्क से विशेष रूप से परिचित नहीं हूं इसलिए मैं उस उत्तर को किसी और को छोड़ दूंगा। :) – kcoppock

+0

धन्यवाद, कृपया इसे किसी ऐसे व्यक्ति के साथ साझा करें जो उत्तर को जान सके? –

1

मैंने एक स्थिर विधि के साथ एक कक्षा लिखी है जो आपको ऐसा करने की अनुमति देगी। यही पर है। आपको विधि में अपना एसएसआईडी, उपयोगकर्ता नाम और पासवर्ड पास करना होगा। कुछ अन्य विकल्प हैं जिन्हें आप सेट कर सकते हैं यदि आपको ईएपी को टीएलएस या पीईएपी में सेट करने की आवश्यकता है। यह ध्यान दिया जाना चाहिए कि यह कोड यहां कोड का आधार है: How to programmatically create and read WEP/EAP WiFi configurations in Android?। अंतर यह है कि मेरा कोड आपको आईपी कॉन्फ़िगरेशन सेटिंग्स और प्रॉक्सी सेटिंग्स को समायोजित करने की अनुमति देता है। इस कोड का उपयोग करके आप WPA_EAP सेटिंग्स के साथ स्वचालित रूप से वाईफ़ाई नेटवर्क से कनेक्ट हो सकते हैं।

आशा इस मदद करता है:

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

आपके उत्तर के लिए धन्यवाद। मैंने पहले इस समाधान को देखा है। यह प्रत्यक्ष एसडीके विधि नहीं है, बल्कि एक प्रतिबिंब हैक। Google द्वारा किसी भी समय दिए गए इन छेद को अवरुद्ध किया जा सकता है। –

+0

नहीं, एसडीके नहीं, लेकिन यह मेरे लिए काम करता है :) – BlackHatSamurai

+0

@HeshanPerera आप उन तकनीकों पर लॉलीपॉप से ​​लिख रहे हैं जो काम नहीं कर रहे हैं। क्या कोई और तरीका है? –

संबंधित मुद्दे

 संबंधित मुद्दे