Android Q版本實現自動連線WiFi
阿新 • • 發佈:2020-12-31
技術標籤:MTK隨記wifi直連運營商wifiSSID自動連線
如何做到自動連線配置wifi:
例:臺灣運營商要求自動連線運營商的免費wifi。
開始對wifi加密之類的不是很瞭解,通過查閱一些資料發現很多方法都不是很適用於Q版本。
所以要自己來搞了。
問題方案如下:
path:alps\frameworks\opt\net\wifi\service\java\com\android\server\wifi\ScanRequestProxy.java
此檔案是對wifi開啟後對搜尋到的wifi列表進行處理,我修改這個需求主要也是在這個檔案中進行操作的。
// Verbose logging flag. private boolean mVerboseLoggingEnabled = false; @@ -131,11 +149,25 @@ public class ScanRequestProxy { if (mVerboseLoggingEnabled) { Log.d(TAG, "Received " + scanResults.length + " scan results"); } + WifiManager mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); + for (int i = 0; i < scanResults.length; i++) { + Log.d("monkey_wifi","isWifiConnected:"+isWifiConnected(mContext)); + Log.d("monkey_wifi","scanResults[i]:"+scanResults[i]); + + // Monkey.20201218 wifi connected + if(scanResults[i].SSID.equals("wifi_ssid") && !isWifiConnected(mContext)){ + + WifiConfiguration wifiNewConfiguration = createWifiInfo("wifi_ssid","",1); + // WifiConfiguration wifiNewConfiguration = scanResults[i]; + mWifiManager.save(wifiNewConfiguration,null);//儲存 + mWifiManager.connect(wifiNewConfiguration,null);//連線 + } + } // Only process full band scan results. if (scanData.getBandScanned() == WifiScanner.WIFI_BAND_BOTH_WITH_DFS) { // Store the last scan results & send out the scan completion broadcast. mLastScanResults.clear();
此方法中對所獲取到的wifi陣列進行遍歷,以匹配到我們需求所需要的直連的ssid然後進行config的配置。AndroidQ版本對於wifi的儲存和連線方法都很簡單,程式碼中有註釋。
+ + /** + * 建立 WifiConfiguration,這裡建立的是wpa2加密方式的wifi + * Moneky WIFI connected + * @param ssid wifi賬號 + * @param password wifi密碼 + * @return + */ + + private WifiConfiguration createWifiInfo(String SSID, String Password, + int Type) { + WifiConfiguration config = new WifiConfiguration(); + config.allowedAuthAlgorithms.clear(); + config.allowedGroupCiphers.clear(); + config.allowedKeyManagement.clear(); + config.allowedPairwiseCiphers.clear(); + config.allowedProtocols.clear(); + config.SSID = "\"" + SSID + "\""; + if (Type == 0) { + // config.wepKeys[0] = "\"" + "\""; + config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); + // config.wepTxKeyIndex = 0; + } else if (Type == 1) { + Log.i("monkey_wifi", "WPA_config : "); + config.hiddenSSID = false; + //安全認證協議 + config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); + config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X); + //企業級WiFi的相關資訊輸入配置 + WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); + enterpriseConfig.setIdentity(SSID);//使用者身份 + // enterpriseConfig.setPassword(wifiConnDO.getPassword());//使用者密碼 + enterpriseConfig.setAnonymousIdentity("");//匿名身份 + enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM);//EAP型別 + // enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.SIM); + enterpriseConfig.setCaCertificateAlias(""); + enterpriseConfig.setClientCertificateAlias(""); + enterpriseConfig.setIdentity(""); + enterpriseConfig.setCaPath(""); + enterpriseConfig.setDomainSuffixMatch(""); + enterpriseConfig.setSimNum(0); + enterpriseConfig.setPassword(""); + + config.enterpriseConfig = enterpriseConfig; + } else { + return null; + } + Log.i("monkey_wifi", "WIFI_config : "+config); + return config; + + } + + public static boolean isWifiConnected(Context context) { + ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); + if(manager != null) { + NetworkCapabilities cap = manager.getNetworkCapabilities(manager.getActiveNetwork()); + return (cap != null) && cap.hasTransport(NetworkCapabilities.TRANSPORT_WIFI); + } + return false; + } + //end
通過自定義方法createWifiInfo傳出相關引數進行config的配置,config的配置要根據wifi所配置的加密方式來決定使用哪種config。
這裡我只定義了兩種,其他的加密方式需要配合log打印出具體的config有哪些再進行配置。
我這裡定義的兩種一種是不適用任何加密方式進行直連,另外一種是使用WAP加密方式,這裡強調下,WAP有幾種配置,根據需求需要自行選擇。
重點記錄一點是關於企業級wifi的相關配置要使用WifiEnterpriseConfig進行配置。
至此結束,問題解決。