API Wi-Fi Suggestion pour la connectivité Internet

Les appareils équipés d'Android 10 (niveau d'API 29) ou version ultérieure permettent à votre application d'ajouter des identifiants réseau pour qu'un appareil se connecte automatiquement à un point d'accès Wi-Fi. Vous pouvez fournir des suggestions de réseaux auxquels vous connecter à l'aide de WifiNetworkSuggestion. Au final, la plate-forme choisit le point d'accès à accepter en fonction des entrées de votre application et d'autres éléments.

Sur Android 11 (niveau d'API 30) ou version ultérieure:

  • Le framework applique des exigences de propriété pour les suggestions Enterprise basées sur EAP-SIM (EAP-SIM, EAP-AKA, EAP-AKA-PRIME). Ces suggestions ne sont autorisées que par les applications signées par l'opérateur.
  • Pour les suggestions fournies par une application signée par l'opérateur, le framework leur attribue automatiquement un ID d'opérateur correspondant à la signature par l'opérateur de l'application. Ces suggestions sont automatiquement désactivées si la carte SIM correspondante est supprimée de l'appareil.

Sur Android 12 (niveau d'API 31) ou version ultérieure:

  • Une confidentialité supplémentaire peut être activée via la randomisation MAC non persistante, qui re randomise régulièrement l'adresse MAC de façon aléatoire. Utilisez setMacRandomizationSetting pour spécifier le niveau de randomisation pour votre réseau.

  • isPasspointTermsAndConditionsSupported() : Conditions d'utilisation est une fonctionnalité Passpoint qui permet aux déploiements réseau de remplacer les portails captifs non sécurisés, qui utilisent des réseaux ouverts, par un réseau Passpoint sécurisé. Une notification s'affiche lorsque l'utilisateur doit accepter les conditions d'utilisation. Les applications qui suggèrent des réseaux Passpoint soumis à des conditions d'utilisation doivent d'abord appeler cette API pour s'assurer que l'appareil est compatible. Si l'appareil n'est pas compatible avec cette fonctionnalité, il ne pourra pas se connecter à ce réseau. Vous devrez alors suggérer un réseau alternatif ou un ancien réseau.

  • isDecoratedIdentitySupported() : lors de l'authentification auprès de réseaux avec une décoration de préfixe, le préfixe d'identité décoré permet aux opérateurs réseau de mettre à jour l'identifiant d'accès au réseau (NAI) pour effectuer un routage explicite via plusieurs proxys au sein d'un réseau AAA (pour en savoir plus, consultez le document RFC 7542).

    Android 12 implémente cette fonctionnalité conformément à la spécification WBA pour les extensions PPS-MO. Les applications qui suggèrent des réseaux Passpoint nécessitant une identité décorée doivent d'abord appeler cette API pour s'assurer que l'appareil est compatible avec cette fonctionnalité. Si l'appareil n'est pas compatible avec cette fonctionnalité, l'identité ne sera pas décorée et l'authentification auprès du réseau peut échouer.

Pour créer une suggestion Passpoint, les applications doivent utiliser les classes PasspointConfiguration, Credential et HomeSp. Ces classes décrivent le profil Passpoint, défini dans la spécification Wi-Fi Alliance Passpoint.

L'exemple de code suivant montre comment fournir les identifiants pour un réseau ouvert, un réseau WPA2, un réseau WPA3 et un réseau 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);

Immédiatement après que l'application a placé une suggestion pour la première fois, l'utilisateur en est informé. Le type de notification dépend de la version d'Android exécutée sur l'appareil:

  • Sur Android 11 (niveau d'API 30) ou version ultérieure, une boîte de dialogue s'affiche si l'application s'exécute au premier plan et une notification si elle s'exécute en arrière-plan.
  • Sous Android 10 (niveau d'API 29), l'utilisateur voit une notification, que l'application soit exécutée au premier plan ou en arrière-plan.

Lorsque la plate-forme se connecte à l'une des suggestions de réseaux, les paramètres affichent un texte qui attribue la connexion réseau à l'application de suggestion correspondante.

Gérer les déconnexions des utilisateurs

Si l'utilisateur se sert du sélecteur de Wi-Fi pour se déconnecter explicitement de l'une des suggestions de réseau lorsqu'il y est connecté, ce réseau est ignoré lorsqu'il est toujours à portée. Pendant cette période, la connexion automatique n'est pas prise en compte sur ce réseau, même si l'application supprime et ajoute à nouveau la suggestion de réseau correspondant au réseau. Si l'utilisateur se sert du sélecteur de Wi-Fi pour se connecter explicitement à un réseau qui a été déconnecté précédemment, ce réseau sera immédiatement considéré pour la connexion automatique.

Modification de l'état d'approbation de l'application

Si un utilisateur refuse la notification de suggestion de réseau, l'autorisation CHANGE_WIFI_STATE sera supprimée de l'application. L'utilisateur pourra accorder cette approbation plus tard en accédant au menu de contrôle du Wi-Fi (Paramètres > Applications et notifications > Accès spéciaux des applis > Contrôle du Wi-Fi > App name).