如何以编程方式创build和阅读Android中的WEP / EAP WiFiconfiguration?

如何以编程方式创build和阅读Android中的WEP/EAP WiFi configurations

在这个问题上,我看到很多人在各种论坛和社区上都在努力奋斗。 我知道这不是直截了当(尤其是EAP),因为当我想达到相同的目标时,我也挣扎了很多。所以,在我做的互联网上的代码分析和search的各种实现的所有艰苦的工作是终于能够达到目标。 所有的功劳归功于开源项目和开发者的数量。

我希望与大家分享这些知识,因为SO 鼓励这样做:“只要你假装自己处于危险之中,问问自己的问题并回答自己的问题也是完全正确的:以问题的forms表述它。”

第1部分: 以编程方式创buildWEP WiFiconfiguration。

第2部分: 以编程方式阅读WEP WiFiconfiguration。

第3部分: 以编程方式阅读EAP WiFiconfiguration。

第4部分: 以编程方式保存EAP WiFiconfiguration。

第1部分:以编程方式创buildWEP WiFiconfiguration

这非常简单, WifiConfiguration公开了创build相同的接口。 这里是示例代码:

 void saveWepConfig() { WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiConfiguration wc = new WifiConfiguration(); wc.SSID = "\"SSID_NAME\""; //IMP! This should be in Quotes!! wc.hiddenSSID = true; wc.status = WifiConfiguration.Status.DISABLED; wc.priority = 40; wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); wc.wepKeys[0] = "\"aaabbb1234\""; //This is the WEP Password wc.wepTxKeyIndex = 0; WifiManager wifiManag = (WifiManager) this.getSystemService(WIFI_SERVICE); boolean res1 = wifiManag.setWifiEnabled(true); int res = wifi.addNetwork(wc); Log.d("WifiPreference", "add Network returned " + res ); boolean es = wifi.saveConfiguration(); Log.d("WifiPreference", "saveConfiguration returned " + es ); boolean b = wifi.enableNetwork(res, true); Log.d("WifiPreference", "enableNetwork returned " + b ); } 

遵循AndroidManifest.xml中所需的权限

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

第2部分:以编程方式阅读WEP WiFiconfiguration
再次直线。 这里是示例代码:

  void readWepConfig() { WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); List<WifiConfiguration> item = wifi.getConfiguredNetworks(); int i = item.size(); Log.d("WifiPreference", "NO OF CONFIG " + i ); Iterator<WifiConfiguration> iter = item.iterator(); WifiConfiguration config = item.get(0); Log.d("WifiPreference", "SSID" + config.SSID); Log.d("WifiPreference", "PASSWORD" + config.preSharedKey); Log.d("WifiPreference", "ALLOWED ALGORITHMS"); Log.d("WifiPreference", "LEAP" + config.allowedAuthAlgorithms.get(AuthAlgorithm.LEAP)); Log.d("WifiPreference", "OPEN" + config.allowedAuthAlgorithms.get(AuthAlgorithm.OPEN)); Log.d("WifiPreference", "SHARED" + config.allowedAuthAlgorithms.get(AuthAlgorithm.SHARED)); Log.d("WifiPreference", "GROUP CIPHERS"); Log.d("WifiPreference", "CCMP" + config.allowedGroupCiphers.get(GroupCipher.CCMP)); Log.d("WifiPreference", "TKIP" + config.allowedGroupCiphers.get(GroupCipher.TKIP)); Log.d("WifiPreference", "WEP104" + config.allowedGroupCiphers.get(GroupCipher.WEP104)); Log.d("WifiPreference", "WEP40" + config.allowedGroupCiphers.get(GroupCipher.WEP40)); Log.d("WifiPreference", "KEYMGMT"); Log.d("WifiPreference", "IEEE8021X" + config.allowedKeyManagement.get(KeyMgmt.IEEE8021X)); Log.d("WifiPreference", "NONE" + config.allowedKeyManagement.get(KeyMgmt.NONE)); Log.d("WifiPreference", "WPA_EAP" + config.allowedKeyManagement.get(KeyMgmt.WPA_EAP)); Log.d("WifiPreference", "WPA_PSK" + config.allowedKeyManagement.get(KeyMgmt.WPA_PSK)); Log.d("WifiPreference", "PairWiseCipher"); Log.d("WifiPreference", "CCMP" + config.allowedPairwiseCiphers.get(PairwiseCipher.CCMP)); Log.d("WifiPreference", "NONE" + config.allowedPairwiseCiphers.get(PairwiseCipher.NONE)); Log.d("WifiPreference", "TKIP" + config.allowedPairwiseCiphers.get(PairwiseCipher.TKIP)); Log.d("WifiPreference", "Protocols"); Log.d("WifiPreference", "RSN" + config.allowedProtocols.get(Protocol.RSN)); Log.d("WifiPreference", "WPA" + config.allowedProtocols.get(Protocol.WPA)); Log.d("WifiPreference", "WEP Key Strings"); String[] wepKeys = config.wepKeys; Log.d("WifiPreference", "WEP KEY 0" + wepKeys[0]); Log.d("WifiPreference", "WEP KEY 1" + wepKeys[1]); Log.d("WifiPreference", "WEP KEY 2" + wepKeys[2]); Log.d("WifiPreference", "WEP KEY 3" + wepKeys[3]); } 

第3部分:以编程方式阅读EAP WiFiconfiguration
现在这是棘手的。 您可以在WifiDialog.java中find通过香草Android UI保存EAP WiFiconfiguration的代码。 很简单我们可以在我们的应用程序中使用相同的代码,好吧,不! 如果你碰巧试过这个,你会得到错误,说找不到符号eapphaseclient_cert等等。 稍微详细的调查告诉我们EnterpriseField is private WiFiConfiguration类中的is private ,我们无法find的所有符号都是EnterpriseFieldtypes的。 那么我们遇到了障碍,我们需要这些字段来读取/保存EAPconfiguration,但我们没有编程访问它们!

Java Reflection API的救援好吧,我不是一个Java专家,所以我不会得到的reflectionAPI的细节,因此,你可以谷歌教程或获得更多的信息在这里 。 为了保持它的简洁和甜蜜,Reflection API允许您在运行时检查类,接口,字段和方法,而不必在编译时知道类的名称,方法等。 也可以实例化新的对象,调用方法和使用reflection来获取/设置字段值。而且,重要的是Reflection可以帮助你访问类中的私有数据成员那么这就是我们所需要的吗? 🙂

现在查看代码示例,其中显示了如何使用Reflection Api读取EAP WiFiconfiguration。 作为奖励的片段将configurationlogging到一个文件,并将其保存在SD卡….非常光滑的..eh;)reflectionApi的一些概述,我肯定抓住下面的代码是容易的。

  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"; final String INT_ENTERPRISEFIELD_NAME = "android.net.wifi.WifiConfiguration$EnterpriseField"; 

这是在调用readEapConfig()函数之前创build日志文件到SD卡上的代码。

  BufferedWriter out = null; try { File root = Environment.getExternalStorageDirectory(); Toast toast = Toast.makeText(this, "SD CARD mounted and writable? " + root.canWrite(), 5000); toast.show(); if (root.canWrite()) { File gpxfile = new File(root, "ReadConfigLog.txt"); FileWriter gpxwriter = new FileWriter(gpxfile); out = new BufferedWriter(gpxwriter); out.write("Hello world"); //out.close(); } } catch (IOException e) { Toast toast = Toast.makeText(this, "Problem reading SD CARD", 3000); Toast toast2 = Toast.makeText(this, "Please take logs using Logcat", 5000); Log.e("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "Could not write file " + e.getMessage()); } 

现在readEapConfig()函数本身:

  void readEapConfig(BufferedWriter out) { /*Get the WifiService */ WifiManager wifi = (WifiManager)getSystemService(WIFI_SERVICE); /*Get All WIfi configurations*/ List<WifiConfiguration> configList = wifi.getConfiguredNetworks(); /*Now we need to search appropriate configuration ie with name SSID_Name*/ for(int i = 0;i<configList.size();i++) { if(configList.get(i).SSID.contentEquals("\"SSID_NAME\"")) { /*We found the appropriate config now read all config details*/ Iterator<WifiConfiguration> iter = configList.iterator(); WifiConfiguration config = configList.get(i); /*I dont think these fields have anything to do with EAP config but still will * print these to be on safe side*/ try { Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[SSID]" + config.SSID); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[SSID]" + config.SSID); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[BSSID]" + config.BSSID); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" +"[BSSID]" + config.BSSID); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[HIDDEN SSID]" + config.hiddenSSID); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[HIDDEN SSID]" + config.hiddenSSID); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[PASSWORD]" + config.preSharedKey); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>"+ "[PASSWORD]" + config.preSharedKey); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[ALLOWED ALGORITHMS]"); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>"+ "[ALLOWED ALGORITHMS]"); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[LEAP]" + config.allowedAuthAlgorithms.get(AuthAlgorithm.LEAP)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[LEAP]" + config.allowedAuthAlgorithms.get(AuthAlgorithm.LEAP)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[OPEN]" + config.allowedAuthAlgorithms.get(AuthAlgorithm.OPEN)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[OPEN]" + config.allowedAuthAlgorithms.get(AuthAlgorithm.OPEN)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[SHARED]" + config.allowedAuthAlgorithms.get(AuthAlgorithm.SHARED)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[SHARED]" + config.allowedAuthAlgorithms.get(AuthAlgorithm.SHARED)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[GROUP CIPHERS]"); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[GROUP CIPHERS]"); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[CCMP]" + config.allowedGroupCiphers.get(GroupCipher.CCMP)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[CCMP]" + config.allowedGroupCiphers.get(GroupCipher.CCMP)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" , "[TKIP]" + config.allowedGroupCiphers.get(GroupCipher.TKIP)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>"+ "[TKIP]" + config.allowedGroupCiphers.get(GroupCipher.TKIP)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP104]" + config.allowedGroupCiphers.get(GroupCipher.WEP104)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP104]" + config.allowedGroupCiphers.get(GroupCipher.WEP104)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP40]" + config.allowedGroupCiphers.get(GroupCipher.WEP40)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP40]" + config.allowedGroupCiphers.get(GroupCipher.WEP40)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[KEYMGMT]"); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[KEYMGMT]"); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[IEEE8021X]" + config.allowedKeyManagement.get(KeyMgmt.IEEE8021X)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>"+ "[IEEE8021X]" + config.allowedKeyManagement.get(KeyMgmt.IEEE8021X)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[NONE]" + config.allowedKeyManagement.get(KeyMgmt.NONE)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[NONE]" + config.allowedKeyManagement.get(KeyMgmt.NONE)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WPA_EAP]" + config.allowedKeyManagement.get(KeyMgmt.WPA_EAP)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WPA_EAP]" + config.allowedKeyManagement.get(KeyMgmt.WPA_EAP)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WPA_PSK]" + config.allowedKeyManagement.get(KeyMgmt.WPA_PSK)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WPA_PSK]" + config.allowedKeyManagement.get(KeyMgmt.WPA_PSK)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[PairWiseCipher]"); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[PairWiseCipher]"); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[CCMP]" + config.allowedPairwiseCiphers.get(PairwiseCipher.CCMP)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[CCMP]" + config.allowedPairwiseCiphers.get(PairwiseCipher.CCMP)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[NONE]" + config.allowedPairwiseCiphers.get(PairwiseCipher.NONE)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[NONE]" + config.allowedPairwiseCiphers.get(PairwiseCipher.NONE)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[TKIP]" + config.allowedPairwiseCiphers.get(PairwiseCipher.TKIP)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[TKIP]" + config.allowedPairwiseCiphers.get(PairwiseCipher.TKIP)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[Protocols]"); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[Protocols]"); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[RSN]" + config.allowedProtocols.get(Protocol.RSN)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[RSN]" + config.allowedProtocols.get(Protocol.RSN)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WPA]" + config.allowedProtocols.get(Protocol.WPA)); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WPA]" + config.allowedProtocols.get(Protocol.WPA)); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[PRE_SHARED_KEY]" + config.preSharedKey); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[PRE_SHARED_KEY]" + config.preSharedKey); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP Key Strings]"); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP Key Strings]"); String[] wepKeys = config.wepKeys; Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP KEY 0]" + wepKeys[0]); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP KEY 0]" + wepKeys[0]); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP KEY 1]" + wepKeys[1]); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP KEY 1]" + wepKeys[1]); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP KEY 2]" + wepKeys[2]); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP KEY 2]" + wepKeys[2]); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP KEY 3]" + wepKeys[3]); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP KEY 3]" + wepKeys[3]); } catch(IOException e) { Toast toast1 = Toast.makeText(this, "Failed to write Logs to ReadConfigLog.txt", 3000); Toast toast2 = Toast.makeText(this, "Please take logs using Logcat", 5000); Log.e("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "Could not write to ReadConfigLog.txt" + e.getMessage()); } /*reflection magic*/ /*These are the fields we are really interested in*/ try { // Let the magic start Class[] wcClasses = WifiConfiguration.class.getClasses(); // null for overzealous java compiler Class wcEnterpriseField = null; for (Class wcClass : wcClasses) if (wcClass.getName().equals(INT_ENTERPRISEFIELD_NAME)) { wcEnterpriseField = wcClass; break; } boolean noEnterpriseFieldType = false; if(wcEnterpriseField == null) noEnterpriseFieldType = true; // Cupcake/Donut access enterprise settings directly Field wcefAnonymousId = null, wcefCaCert = null, wcefClientCert = null, wcefEap = null, wcefIdentity = null, wcefPassword = null, wcefPhase2 = null, wcefPrivateKey = null; Field[] wcefFields = WifiConfiguration.class.getFields(); // Dispatching Field vars for (Field wcefField : wcefFields) { if (wcefField.getName().trim().equals(INT_ANONYMOUS_IDENTITY)) wcefAnonymousId = wcefField; else if (wcefField.getName().trim().equals(INT_CA_CERT)) wcefCaCert = wcefField; else if (wcefField.getName().trim().equals(INT_CLIENT_CERT)) wcefClientCert = wcefField; else if (wcefField.getName().trim().equals(INT_EAP)) wcefEap = wcefField; else if (wcefField.getName().trim().equals(INT_IDENTITY)) wcefIdentity = wcefField; else if (wcefField.getName().trim().equals(INT_PASSWORD)) wcefPassword = wcefField; else if (wcefField.getName().trim().equals(INT_PHASE2)) wcefPhase2 = wcefField; else if (wcefField.getName().trim().equals(INT_PRIVATE_KEY)) wcefPrivateKey = wcefField; } Method wcefValue = null; if(!noEnterpriseFieldType) { for(Method m: wcEnterpriseField.getMethods()) //System.out.println(m.getName()); if(m.getName().trim().equals("value")){ wcefValue = m; break; } } /*EAP Method*/ String result = null; Object obj = null; if(!noEnterpriseFieldType) { obj = wcefValue.invoke(wcefEap.get(config), null); String retval = (String)obj; Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP METHOD]" + retval); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP METHOD]" + retval); } else { obj = wcefEap.get(config); String retval = (String)obj; } /*phase 2*/ if(!noEnterpriseFieldType) { result = (String) wcefValue.invoke(wcefPhase2.get(config), null); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP PHASE 2 AUTHENTICATION]" + result); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP PHASE 2 AUTHENTICATION]" + result); } else { result = (String) wcefPhase2.get(config); } /*Anonymous Identity*/ if(!noEnterpriseFieldType) { result = (String) wcefValue.invoke(wcefAnonymousId.get(config),null); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP ANONYMOUS IDENTITY]" + result); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP ANONYMOUS IDENTITY]" + result); } else { result = (String) wcefAnonymousId.get(config); } /*CA certificate*/ if(!noEnterpriseFieldType) { result = (String) wcefValue.invoke(wcefCaCert.get(config), null); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP CA CERTIFICATE]" + result); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP CA CERTIFICATE]" + result); } else { result = (String)wcefCaCert.get(config); } /*private key*/ if(!noEnterpriseFieldType) { result = (String) wcefValue.invoke(wcefPrivateKey.get(config),null); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP PRIVATE KEY]" + result); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP PRIVATE KEY]" + result); } else { result = (String)wcefPrivateKey.get(config); } /*Identity*/ if(!noEnterpriseFieldType) { result = (String) wcefValue.invoke(wcefIdentity.get(config), null); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP IDENTITY]" + result); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP IDENTITY]" + result); } else { result = (String)wcefIdentity.get(config); } /*Password*/ if(!noEnterpriseFieldType) { result = (String) wcefValue.invoke(wcefPassword.get(config), null); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP PASSWORD]" + result); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP PASSWORD]" + result); } else { result = (String)wcefPassword.get(config); } /*client certificate*/ if(!noEnterpriseFieldType) { result = (String) wcefValue.invoke(wcefClientCert.get(config), null); Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP CLIENT CERT]" + result); out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP CLIENT CERT]" + result); Toast toast1 = Toast.makeText(this, "All config data logged to ReadConfigLog.txt", 3000); Toast toast2 = Toast.makeText(this, "Extract ReadConfigLog.txt from SD CARD", 5000); } else { result = (String)wcefClientCert.get(config); } out.close(); } catch(IOException e) { Toast toast1 = Toast.makeText(this, "Failed to write Logs to ReadConfigLog.txt", 3000); Toast toast2 = Toast.makeText(this, "Please take logs using Logcat", 5000); Log.e("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "Could not write to ReadConfigLog.txt" + e.getMessage()); } catch(Exception e) { e.printStackTrace(); } } } } 

啊,我跑出了编辑空间,在这里添加剩下的部分。

第4部分:以编程方式保存EAP WiFiconfiguration

如果您已经阅读了第3部分,那么您已经了解了在这里工作的Reflection魔术,如果您直接跳到本节,请阅读第3部分的代码片段之前的介绍,您将快速浏览代码!

 void saveEapConfig(String passString, String userName) { /********************************Configuration Strings****************************************************/ final String ENTERPRISE_EAP = "TLS"; final String ENTERPRISE_CLIENT_CERT = "keystore://USRCERT_CertificateName"; final String ENTERPRISE_PRIV_KEY = "USRPKEY_CertificateName"; //CertificateName = Name given to the certificate while installing it /*Optional Params- My wireless Doesn't use these*/ final String ENTERPRISE_PHASE2 = ""; final String ENTERPRISE_ANON_IDENT = "ABC"; final String ENTERPRISE_CA_CERT = ""; // If required: "keystore://CACERT_CaCertificateName" /********************************Configuration Strings****************************************************/ /*Create a WifiConfig*/ WifiConfiguration selectedConfig = new WifiConfiguration(); /*AP Name*/ selectedConfig.SSID = "\"SSID_Name\""; /*Priority*/ selectedConfig.priority = 40; /*Enable Hidden SSID*/ selectedConfig.hiddenSSID = true; /*Key Mgmnt*/ selectedConfig.allowedKeyManagement.clear(); selectedConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X); selectedConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); /*Group Ciphers*/ selectedConfig.allowedGroupCiphers.clear(); selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); /*Pairwise ciphers*/ selectedConfig.allowedPairwiseCiphers.clear(); selectedConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); selectedConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); /*Protocols*/ selectedConfig.allowedProtocols.clear(); selectedConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); selectedConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // Enterprise Settings // Reflection magic here too, need access to non-public APIs try { // Let the magic start Class[] wcClasses = WifiConfiguration.class.getClasses(); // null for overzealous java compiler Class wcEnterpriseField = null; for (Class wcClass : wcClasses) if (wcClass.getName().equals(INT_ENTERPRISEFIELD_NAME)) { wcEnterpriseField = wcClass; break; } boolean noEnterpriseFieldType = false; if(wcEnterpriseField == null) noEnterpriseFieldType = true; // Cupcake/Donut access enterprise settings directly Field wcefAnonymousId = null, wcefCaCert = null, wcefClientCert = null, wcefEap = null, wcefIdentity = null, wcefPassword = null, wcefPhase2 = null, wcefPrivateKey = null, wcefEngine = null, wcefEngineId = null; Field[] wcefFields = WifiConfiguration.class.getFields(); // Dispatching Field vars for (Field wcefField : wcefFields) { if (wcefField.getName().equals(INT_ANONYMOUS_IDENTITY)) wcefAnonymousId = wcefField; else if (wcefField.getName().equals(INT_CA_CERT)) wcefCaCert = wcefField; else if (wcefField.getName().equals(INT_CLIENT_CERT)) wcefClientCert = wcefField; else if (wcefField.getName().equals(INT_EAP)) wcefEap = wcefField; else if (wcefField.getName().equals(INT_IDENTITY)) wcefIdentity = wcefField; else if (wcefField.getName().equals(INT_PASSWORD)) wcefPassword = wcefField; else if (wcefField.getName().equals(INT_PHASE2)) wcefPhase2 = wcefField; else if (wcefField.getName().equals(INT_PRIVATE_KEY)) wcefPrivateKey = wcefField; else if (wcefField.getName().equals("engine")) wcefEngine = wcefField; else if (wcefField.getName().equals("engine_id")) wcefEngineId = wcefField; } Method wcefSetValue = null; if(!noEnterpriseFieldType){ for(Method m: wcEnterpriseField.getMethods()) //System.out.println(m.getName()); if(m.getName().trim().equals("setValue")) wcefSetValue = m; } /*EAP Method*/ if(!noEnterpriseFieldType) { wcefSetValue.invoke(wcefEap.get(selectedConfig), ENTERPRISE_EAP); } else { wcefEap.set(selectedConfig, ENTERPRISE_EAP); } /*EAP Phase 2 Authentication*/ if(!noEnterpriseFieldType) { wcefSetValue.invoke(wcefPhase2.get(selectedConfig), ENTERPRISE_PHASE2); } else { wcefPhase2.set(selectedConfig, ENTERPRISE_PHASE2); } /*EAP Anonymous Identity*/ if(!noEnterpriseFieldType) { wcefSetValue.invoke(wcefAnonymousId.get(selectedConfig), ENTERPRISE_ANON_IDENT); } else { wcefAnonymousId.set(selectedConfig, ENTERPRISE_ANON_IDENT); } /*EAP CA Certificate*/ if(!noEnterpriseFieldType) { wcefSetValue.invoke(wcefCaCert.get(selectedConfig), ENTERPRISE_CA_CERT); } else { wcefCaCert.set(selectedConfig, ENTERPRISE_CA_CERT); } /*EAP Private key*/ if(!noEnterpriseFieldType) { wcefSetValue.invoke(wcefPrivateKey.get(selectedConfig), ENTERPRISE_PRIV_KEY); } else { wcefPrivateKey.set(selectedConfig, ENTERPRISE_PRIV_KEY); } /*EAP Identity*/ if(!noEnterpriseFieldType) { wcefSetValue.invoke(wcefIdentity.get(selectedConfig), userName); } else { wcefIdentity.set(selectedConfig, userName); } /*EAP Password*/ if(!noEnterpriseFieldType) { wcefSetValue.invoke(wcefPassword.get(selectedConfig), passString); } else { wcefPassword.set(selectedConfig, passString); } /*EAp Client certificate*/ if(!noEnterpriseFieldType) { wcefSetValue.invoke(wcefClientCert.get(selectedConfig), ENTERPRISE_CLIENT_CERT); } else { wcefClientCert.set(selectedConfig, ENTERPRISE_CLIENT_CERT); } /*Engine fields*/ if(!noEnterpriseFieldType) { wcefSetValue.invoke(wcefEngine.get(wifiConf), "1"); wcefSetValue.invoke(wcefEngineId.get(wifiConf), "keystore"); } // Adhoc for CM6 // if non-CM6 fails gracefully thanks to nested try-catch try{ Field wcAdhoc = WifiConfiguration.class.getField("adhocSSID"); Field wcAdhocFreq = WifiConfiguration.class.getField("frequency"); //wcAdhoc.setBoolean(selectedConfig, prefs.getBoolean(PREF_ADHOC, // false)); wcAdhoc.setBoolean(selectedConfig, false); int freq = 2462; // default to channel 11 //int freq = Integer.parseInt(prefs.getString(PREF_ADHOC_FREQUENCY, //"2462")); // default to channel 11 //System.err.println(freq); wcAdhocFreq.setInt(selectedConfig, freq); } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { // TODO Auto-generated catch block // FIXME As above, what should I do here? e.printStackTrace(); } WifiManager wifiManag = (WifiManager) getSystemService(Context.WIFI_SERVICE); boolean res1 = wifiManag.setWifiEnabled(true); int res = wifiManag.addNetwork(selectedConfig); Log.d("WifiPreference", "add Network returned " + res ); boolean b = wifiManag.enableNetwork(selectedConfig.networkId, false); Log.d("WifiPreference", "enableNetwork returned " + b ); boolean c = wifiManag.saveConfiguration(); Log.d("WifiPreference", "Save configuration returned " + c ); boolean d = wifiManag.enableNetwork(res, true); Log.d("WifiPreference", "enableNetwork returned " + d ); } 

那好吧! 我希望这可以帮助一些失去的开发人员,某处,某个时候:)

Android为JellyBean 4.3添加了一个API。 如果要在API 18上configurationWIFI,则必须使用此选项:

http://developer.android.com/reference/android/net/wifi/WifiEnterpriseConfig.html

第四部分让我走上了正确的道路! 但是我想创build一个TTLS而不是TLSconfiguration这里是我怎么做的!

  /********************************Configuration Strings****************************************************/ final String ENTERPRISE_EAP = "TTLS"; /*Optional Params- My wireless Doesn't use these*/ final String ENTERPRISE_PHASE2 = "PAP"; final String ENTERPRISE_ANON_IDENT = "ABC"; final String ENTERPRISE_CA_CERT = ""; /********************************Configuration Strings****************************************************/ /*Create a WifiConfig*/ WifiConfiguration selectedConfig = new WifiConfiguration(); /*AP Name*/ selectedConfig.SSID = "\"EAP_SSID_TEST_CONFIG\""; /*Priority*/ selectedConfig.priority = 40; /*Enable Hidden SSID*/ selectedConfig.hiddenSSID = false; /*Key Mgmnt*/ selectedConfig.allowedKeyManagement.clear(); selectedConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X); selectedConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); /*Group Ciphers*/ selectedConfig.allowedGroupCiphers.clear(); selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); /*Pairwise ciphers*/ selectedConfig.allowedPairwiseCiphers.clear(); selectedConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); selectedConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); /*Protocols*/ selectedConfig.allowedProtocols.clear(); selectedConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); selectedConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // Enterprise Settings // Reflection magic here too, need access to non-public APIs try { // Let the magic start Class[] wcClasses = WifiConfiguration.class.getClasses(); // null for overzealous java compiler Class wcEnterpriseField = null; for (Class wcClass : wcClasses) if (wcClass.getName().equals(INT_ENTERPRISEFIELD_NAME)) { wcEnterpriseField = wcClass; break; } boolean noEnterpriseFieldType = false; if(wcEnterpriseField == null) noEnterpriseFieldType = true; // Cupcake/Donut access enterprise settings directly Field wcefAnonymousId = null, wcefCaCert = null, wcefClientCert = null, wcefEap = null, wcefIdentity = null, wcefPassword = null, wcefPhase2 = null, wcefPrivateKey = null; Field[] wcefFields = WifiConfiguration.class.getFields(); // Dispatching Field vars for (Field wcefField : wcefFields) { if (wcefField.getName().equals(INT_ANONYMOUS_IDENTITY)) wcefAnonymousId = wcefField; else if (wcefField.getName().equals(INT_CA_CERT)) wcefCaCert = wcefField; else if (wcefField.getName().equals(INT_CLIENT_CERT)) wcefClientCert = wcefField; else if (wcefField.getName().equals(INT_EAP)) wcefEap = wcefField; else if (wcefField.getName().equals(INT_IDENTITY)) wcefIdentity = wcefField; else if (wcefField.getName().equals(INT_PASSWORD)) wcefPassword = wcefField; else if (wcefField.getName().equals(INT_PHASE2)) wcefPhase2 = wcefField; else if (wcefField.getName().equals(INT_PRIVATE_KEY)) wcefPrivateKey = wcefField; } Method wcefSetValue = null; if(!noEnterpriseFieldType){ for(Method m: wcEnterpriseField.getMethods()) //System.out.println(m.getName()); if(m.getName().trim().equals("setValue")) wcefSetValue = m; } /*EAP Method*/ if(!noEnterpriseFieldType){ wcefSetValue.invoke(wcefEap.get(selectedConfig), ENTERPRISE_EAP); } /*EAP Phase 2 Authentication*/ if(!noEnterpriseFieldType){ wcefSetValue.invoke(wcefPhase2.get(selectedConfig), ENTERPRISE_PHASE2); } /*EAP Anonymous Identity*/ if(!noEnterpriseFieldType){ wcefSetValue.invoke(wcefAnonymousId.get(selectedConfig), ENTERPRISE_ANON_IDENT); } /*EAP CA Certificate*/ if(!noEnterpriseFieldType){ wcefSetValue.invoke(wcefCaCert.get(selectedConfig), ENTERPRISE_CA_CERT); } /*EAP Identity*/ if(!noEnterpriseFieldType){ wcefSetValue.invoke(wcefIdentity.get(selectedConfig), "test user name"); } /*EAP Password*/ if(!noEnterpriseFieldType){ wcefSetValue.invoke(wcefPassword.get(selectedConfig), "test password"); } try{ } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } WifiManager wifiManag = (WifiManager) getSystemService(Context.WIFI_SERVICE); boolean res1 = wifiManag.setWifiEnabled(true); int res = wifiManag.addNetwork(selectedConfig); Log.d("WifiPreference", "add Network returned " + res ); // boolean b = wifiManag.enableNetwork(selectedConfig.networkId, false); // Log.d("WifiPreference", "enableNetwork returned " + b ); // boolean c = wifiManag.saveConfiguration(); // Log.d("WifiPreference", "Save configuration returned " + c ); // boolean d = wifiManag.enableNetwork(res, true); // Log.d("WifiPreference", "enableNetwork returned " + d ); } 

Hope this helps some one. @Android learner I removed the bit about adHocFrequency and SSID as they were causing crashes but my results were still good without them.

The WEP keys are masked, so it is not possible to read them with the mentioned code

  Log.d("WifiPreference", "WEP KEY 0" + wepKeys[0]); Log.d("WifiPreference", "WEP KEY 1" + wepKeys[1]); Log.d("WifiPreference", "WEP KEY 2" + wepKeys[2]); Log.d("WifiPreference", "WEP KEY 3" + wepKeys[3]); 

Is there any way to solve this in same way as the EAP solution? With reflection?