1. 程式人生 > 其它 >Android Q版本實現自動連線WiFi

Android Q版本實現自動連線WiFi

技術標籤: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進行配置。

至此結束,問題解決。