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 reti credenziali necessarie a un dispositivo per la connessione automatica a un punto di accesso Wi-Fi. Puoi fornire suggerimenti per la rete a cui connettersi utilizzando WifiNetworkSuggestion La piattaforma sceglie infine quale punto di accesso accettare in base al input provenienti dalla tua app e da altre app.

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

  • Eseguire il provisioning di una PasspointConfiguration è supportato dall'API Recommendations. Prima di Android 11, durante il provisioning di un PasspointConfiguration richiede l'utilizzo di addOrUpdatePasspointConfiguration() tramite Google Cloud CLI o tramite l'API Compute Engine.
  • Il framework applica requisiti di sicurezza per le aziende basate su TLS suggerimenti (EAP-TLS, EAP-TTLS ed EAP-PEAP); suggerimenti a queste reti devi impostare un valore Root CA certificate e un server domain name.
di Gemini Advanced.
  • Il framework applica i requisiti di proprietà per le aziende basate su EAP-SIM suggerimenti (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); tali suggerimenti sono consentito solo dalle app firmate dall'operatore.
  • Per i suggerimenti forniti da un'app firmata dall'operatore, il framework automaticamente e assegna loro un ID operatore corrispondente firma dell'operatore. Tale i suggerimenti vengono disattivati automaticamente se viene rimossa la SIM corrispondente dal dispositivo.

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

  • È possibile abilitare un'ulteriore privacy tramite la randomizzazione degli indirizzi MAC non persistenti, che esegue di nuovo la randomizzazione dell'indirizzo MAC randomizzato. Utilizza setMacRandomizationSetting per specificare il livello di randomizzazione per la tua rete.

  • isPasspointTermsAndConditionsSupported(): Termini e condizioni è un passpoint che consente alle implementazioni di rete di sostituire i captive portal non sicuri, che usano reti aperte, con una rete Passpoint sicura. La notifica è mostrati all'utente quando è necessario accettare termini e condizioni. App che suggeriscono reti Passpoint controllate da Termini e condizioni deve prima chiamare questa API per assicurarsi che il dispositivo supporti la funzionalità. Se il dispositivo non supporta questa funzionalità, non potrà connettersi a questa rete ed è necessario suggerire una rete alternativa o legacy.

  • isDecoratedIdentitySupported(): Quando esegui l'autenticazione sulle emittenti con una decorazione del prefisso, il prefisso di identità consente agli operatori di rete di aggiornare l'accesso alla rete identificatore (NAI) per eseguire il routing esplicito attraverso più proxy all'interno di una rete AAA (vedi RFC 7542 per di più al riguardo).

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

Per creare un suggerimento di Passpoint, le app devono utilizzare la PasspointConfiguration, Credential e HomeSp corsi. Questi Queste classi descrivono il profilo Passpoint, definito in Wi-Fi Alliance Passpoint la specifica del prodotto.

Il seguente esempio di codice mostra come fornire le credenziali per uno 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 visualizza notificato. Il tipo di notifica dipende dalla versione di Android in uso 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 sfondo.
  • Su Android 10 (livello API 29), l'utente vede una notifica, indipendentemente dal fatto che sia 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 vengono mostrate testo che attribuisce la connessione di rete all'app suggeritore corrispondente.

Gestione della disconnessione degli utenti

Se l'utente utilizza il selettore Wi-Fi per disconnettersi esplicitamente da uno dei suggerimenti di rete quando ci si connette, questa rete viene ignorata quando è ancora nel raggio d'azione. Durante questo periodo, la rete non sarà considerata per la connessione automatica, anche se l'app rimuove e aggiunge nuovamente il suggerimento di rete corrispondenti alla rete. Se l'utente utilizza il selettore Wi-Fi per connettersi a una rete precedentemente scollegata, la rete verrà considerata per la connessione automatica.

Modifica dello stato di approvazione dell'app

Se l'utente rifiuta la notifica di suggerimento di rete, viene rimosso CHANGE_WIFI_STATE dall'app. L'utente può concedere questa approvazione in seguito andando al menu di controllo del Wi-Fi (Impostazioni > App e notifiche > App speciale accesso > Controllo Wi-Fi > App name).