用於網際網路連線的 Wi-Fi Suggestion API

搭載 Android 10 (API 級別 29) 以上版本的裝置允許您的應用程式新增網路 裝置憑證,才能自動連線至 Wi-Fi 存取點。你可以提供 建議您使用下列提示 WifiNetworkSuggestion。 平台最終會根據 應用程式和其他使用者的輸入內容

Android 11 (API 級別 30) 以上版本:

,瞭解如何調查及移除這項存取權。
  • 該架構會強制執行 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 建議,應用程式必須使用 PasspointConfigurationCredentialHomeSp 類別。這些 類別會說明 Passpoint 設定檔 (定義於 Wi-Fi Alliance) Passpoint 規格

下列程式碼範例說明如何提供憑證一次 WPA2、一個 WPA3 網路及一個 Passpoint 網路:

Kotlin

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);

Java

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)。