API per suggerimenti di Wi-Fi per la connettività a Internet

I dispositivi con Android 10 (livello API 29) e versioni successive consentono alla tua app di aggiungere le credenziali di rete per un dispositivo per connettersi automaticamente a un punto di accesso Wi-Fi. Puoi fornire suggerimenti sulla rete a cui connetterti utilizzando WifiNetworkSuggestion. La piattaforma sceglie in definitiva quale punto di accesso accettare in base all'input della tua app e di altre.

Su Android 11 (livello API 30) e versioni successive:

  • Il framework applica i requisiti di proprietà per i suggerimenti aziendali basati su EAP-SIM (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); questi suggerimenti sono consentiti solo dalle app firmate dall'operatore.
  • Per i suggerimenti forniti da un'app firmata dall'operatore, il framework assegna automaticamente un ID operatore corrispondente alla firma dell'operatore dell'app. Questi suggerimenti vengono disattivati automaticamente se la SIM corrispondente viene rimossa dal dispositivo.

Su Android 12 (livello API 31) e versioni successive:

  • È possibile attivare una maggiore privacy tramite la randomizzazione dell'indirizzo MAC non persistente, che randomizza periodicamente l'indirizzo MAC casuale. Utilizza setMacRandomizationSetting per specificare il livello di randomizzazione per la tua rete.

  • isPasspointTermsAndConditionsSupported(): Termini e condizioni è una funzionalità Passpoint che consente alle implementazioni di rete di sostituire i captive portal non sicuri, che utilizzano reti aperte, con una rete Passpoint sicura. All'utente viene mostrata una notifica quando è necessario accettare i Termini e condizioni. Le app che suggeriscono reti Passpoint protette da termini e condizioni devono chiamare prima questa API per assicurarsi che il dispositivo supporti la funzionalità. Se il dispositivo non supporta la funzionalità, non sarà in grado di connettersi a questa rete e deve essere suggerita una rete alternativa o legacy.

  • isDecoratedIdentitySupported(): Quando si esegue l'autenticazione alle reti con una decorazione del prefisso, il prefisso dell'identità decorato consente agli operatori di rete di aggiornare l'identificatore di accesso alla rete (NAI) per eseguire il routing esplicito tramite più proxy all'interno di una rete AAA (vedi RFC 7542 per ulteriori informazioni).

    Android 12 implementa questa funzionalità in conformità con la specifica WBA per le estensioni PPS-MO. Le app che suggeriscono reti Passpoint che richiedono un'identità decorata devono chiamare prima questa API per assicurarsi che il dispositivo supporti la funzionalità. Se il dispositivo non supporta la funzionalità, l'identità non verrà decorata e l'autenticazione alla rete potrebbe non riuscire.

Per creare un suggerimento Passpoint, le app devono utilizzare le classi PasspointConfiguration, Credential e HomeSp. Queste classi descrivono il profilo Passpoint, definito nelle specifiche Passpoint di Wi-Fi Alliance.

Il seguente esempio di codice mostra come fornire le credenziali per una rete aperta, una rete WPA2, una rete WPA3 e una rete 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);

Subito dopo che l'app inserisce un suggerimento per la prima volta, l'utente riceve una notifica. Il tipo di notifica dipende dalla versione di Android in esecuzione sul dispositivo:

  • Su Android 11 (livello API 30) e versioni successive, l'utente vede una finestra di dialogo se l'app è in esecuzione in primo piano e una notifica se l'app è in esecuzione in background.
  • Su Android 10 (livello API 29), l'utente vede una notifica, indipendentemente dal fatto che l'app sia in esecuzione in primo piano o in background.

Quando la piattaforma si connette a uno dei suggerimenti di rete, le impostazioni mostrano un testo che attribuisce la connessione di rete all'app di suggerimento corrispondente.

Gestione delle disconnessioni degli utenti

Se l'utente utilizza il selettore Wi-Fi per disconnettersi esplicitamente da uno dei suggerimenti di rete quando è connesso, la rete viene ignorata quando è ancora nel raggio d'azione. Durante questo periodo, la rete non verrà presa in considerazione per la connessione automatica, anche se l'app rimuove e aggiunge nuovamente il suggerimento di rete corrispondente. Se l'utente utilizza il selettore Wi-Fi per connettersi esplicitamente a una rete precedentemente disconnessa, questa rete verrà presa in considerazione per la connessione automatica immediatamente.

Modifica dello stato di approvazione dell'app

Se un utente rifiuta la notifica di suggerimento della rete, l'app non avrà più l'autorizzazione CHANGE_WIFI_STATE. L'utente potrà concedere questa approvazione in un secondo momento accedendo al menu di controllo del Wi-Fi (Impostazioni > App e notifiche > Accesso speciale alle app > Controllo Wi-Fi > App name).