搭載 Android 10 (API 級別 29) 以上版本的裝置允許您的應用程式新增網路
裝置憑證,才能自動連線至 Wi-Fi 存取點。你可以提供
建議您使用下列提示
WifiNetworkSuggestion
。
平台最終會根據
應用程式和其他使用者的輸入內容
在 Android 11 (API 級別 30) 以上版本中:
- 佈建
PasspointConfiguration
這項建議 API 可支援在 Android 11 之前,您必須使用addOrUpdatePasspointConfiguration()
API 才能佈建PasspointConfiguration
。 - 此架構會針對以 TLS 為基礎的企業建議 (EAP-TLS、EAP-TTLS 和 EAP-PEAP) 強制執行安全性規定;針對這類網路的建議必須設定
Root CA certificate
和server domain name
。
- 該架構會強制執行 EAP-SIM 型企業的擁有權規定 建議 (EAP-SIM、EAP-AKA、EAP-AKA-PRIME)這類建議 僅供電信業者簽署的應用程式使用。
- 針對由電信業者簽署的應用程式提供的建議,架構會自動 可針對應用程式的 電信業者簽署。這些 如果移除對應的 SIM 卡,系統會自動停用建議功能 登入裝置。
在 Android 12 (API 級別 31) 以上版本中:
非永久 MAC 隨機化可啟用其他隱私保護功能。 ,這個伺服器會定期重新隨機化隨機化 MAC 位址。 使用
setMacRandomizationSetting
指定網路的隨機化程度。isPasspointTermsAndConditionsSupported()
: 條款及細則屬於Passpoint 這項功能可讓網路部署項目取代不安全的網頁認證入口 支援開放式網路,並搭配安全的 Passpoint 網路。以下是 在必須接受條款及細則的情況下顯示。 這類應用程式會建議受條款及細則管制的 Passpoint 網路 必須先呼叫此 API,以確保裝置支援此功能。 如果裝置不支援這項功能,就無法連線至這個網路,因此必須建議使用其他或舊版網路。isDecoratedIdentitySupported()
: 使用前置字元裝飾的網路進行驗證時, 身分前置字串可讓網路業者更新網路存取權 透過 ID (NAI) 執行透過多個 Proxy 執行的明確轉送 的 AAA 網路 (請參閱 專用 RFC 7542 。Android 12 會實作這項功能,以符合 WBA 的 PPS-MO 擴充功能。 如果應用程式建議使用的 Passpoint 網路為需要裝飾的身分,就必須這麼做 請先呼叫此 API,確認裝置支援此功能。如果裝置不支援該功能,系統就不會修飾身分,網路的驗證作業也可能會失敗。
如要建立 Passpoint 建議,應用程式必須使用
PasspointConfiguration
,
Credential
和
HomeSp
類別。這些
類別會說明 Passpoint 設定檔 (定義於 Wi-Fi Alliance)
Passpoint
規格。
以下程式碼範例說明如何為一個開放式、一個 WPA2、一個 WPA3 網路和一個 Passpoint 網路提供憑證:
val suggestion1 = WifiNetworkSuggestion.Builder() .setSsid("test111111") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestion2 = WifiNetworkSuggestion.Builder() .setSsid("test222222") .setWpa2Passphrase("test123456") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestion3 = WifiNetworkSuggestion.Builder() .setSsid("test333333") .setWpa3Passphrase("test6789") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val passpointConfig = PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration val suggestion4 = WifiNetworkSuggestion.Builder() .setPasspointConfig(passpointConfig) .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestionsList = listOf(suggestion1, suggestion2, suggestion3, suggestion4); val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager; val status = wifiManager.addNetworkSuggestions(suggestionsList); if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) { // do error handling here } // Optional (Wait for post connection broadcast to one of your suggestions) val intentFilter = IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION); val broadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (!intent.action.equals(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) { return; } // do post connect processing here } }; context.registerReceiver(broadcastReceiver, intentFilter);
final WifiNetworkSuggestion suggestion1 = new WifiNetworkSuggestion.Builder() .setSsid("test111111") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final WifiNetworkSuggestion suggestion2 = new WifiNetworkSuggestion.Builder() .setSsid("test222222") .setWpa2Passphrase("test123456") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final WifiNetworkSuggestion suggestion3 = new WifiNetworkSuggestion.Builder() .setSsid("test333333") .setWpa3Passphrase("test6789") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final PasspointConfiguration passpointConfig = new PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration final WifiNetworkSuggestion suggestion4 = new WifiNetworkSuggestion.Builder() .setPasspointConfig(passpointConfig) .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final List<WifiNetworkSuggestion> suggestionsList = new ArrayList<WifiNetworkSuggestion> {{ add(suggestion1); add(suggestion2); add(suggestion3); add(suggestion4); }}; final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); final int status = wifiManager.addNetworkSuggestions(suggestionsList); if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) { // do error handling here… } // Optional (Wait for post connection broadcast to one of your suggestions) final IntentFilter intentFilter = new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION); final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (!intent.getAction().equals( WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) { return; } // do post connect processing here... } }; context.registerReceiver(broadcastReceiver, intentFilter);
應用程式首次提出建議後,使用者會立即看到 通知。通知類型取決於搭載的 Android 版本 應用程式:
- 在 Android 11 (API 級別 30) 以上版本中,如果應用程式在前景執行,使用者會看到對話方塊,如果應用程式在背景執行,則會看到通知。
- 在 Android 10 (API 級別 29) 中,不論 指出應用程式是在前景或背景執行。
當平台連線至其中一個網路建議時,設定會顯示文字,將網路連線歸因於相應的建議者應用程式。
處理使用者中斷連線
如果使用者在連線至其中一個網路建議時,使用 Wi-Fi 挑選器明確斷開連線,系統就會在該網路仍在範圍內時忽略該網路。在這段期間內,系統不會考慮這個聯播網 使用自動連線功能,即使應用程式移除並重新新增網路建議 每個執行個體都會有對應的如果使用者使用 Wi-Fi 挑選器,明確連線至先前已斷線的網路,系統會立即將該網路視為可自動連線的網路。
變更應用程式的核准狀態
如果使用者拒絕網路建議通知,應用程式就會移除 CHANGE_WIFI_STATE
權限。使用者稍後可以前往 Wi-Fi 控制選單 (設定 > 應用程式和通知 > 特殊應用程式存取權 > Wi-Fi 控制 > App name) 授予這項權限。