API Wi-Fi Network Request pour la connectivité peer-to-peer

Sur les appareils Android 10 (niveau d'API 29) ou version ultérieure, vous pouvez utiliser une nouvelle API peer-to-peer pour amorcer la configuration des appareils secondaires tels que Chromecast et le matériel Google Home. Cette fonctionnalité permet à votre application d'inviter l'utilisateur à modifier le point d'accès auquel l'appareil est connecté en utilisant WifiNetworkSpecifier pour décrire les propriétés d'un réseau demandé.

Pour utiliser cette API, procédez comme suit :

  1. Créez un spécificateur de réseau Wi-Fi à l'aide de WifiNetworkSpecifier.Builder.

  2. Définissez un filtre de réseau pour faire correspondre les réseaux auxquels vous souhaitez vous connecter, ainsi que les identifiants requis.

  3. Choisissez une combinaison de SSID, SSID pattern, BSSID et BSSID pattern pour définir le filtre de réseau dans chaque requête, sous réserve des exigences suivantes:

    • Chaque requête doit fournir au moins l'un des éléments suivants : SSID, SSID pattern, BSSID ou BSSID pattern.
    • Chaque requête ne peut définir qu'une seule des valeurs SSID ou SSID pattern.
    • Chaque requête ne peut définir qu'une seule des valeurs BSSID ou BSSID pattern.
  4. Ajoutez les spécificateurs à la requête réseau ainsi qu'une instance NetworkCallback pour suivre l'état de la requête.

    Si l'utilisateur accepte la requête et que la connexion au réseau est établie, NetworkCallback.onAvailable() est appelé sur l'objet de rappel. Si l'utilisateur refuse la requête ou si la connexion au réseau échoue, NetworkCallback.onUnavailable() est appelé sur l'objet de rappel.

Lorsque vous lancez la requête de connexion à un appareil pair, une boîte de dialogue s'ouvre sur le même appareil, à partir de laquelle l'utilisateur de cet appareil peut accepter la demande de connexion.

Contournement de l'approbation de l'utilisateur

Une fois que l'utilisateur a approuvé un réseau auquel se connecter en réponse à une demande provenant d'une application spécifique, l'appareil stocke l'approbation pour le point d'accès concerné. Si l'application envoie une demande spécifique de connexion à ce point d'accès à nouveau, l'appareil ignore la phase d'approbation de l'utilisateur et se connecte automatiquement au réseau. Si l'utilisateur choisit d'oublier le réseau lorsqu'il est connecté à un réseau demandé par l'API, cette approbation stockée pour cette combinaison d'application et de réseau est supprimée, et toute demande ultérieure de l'application doit à nouveau être approuvée par l'utilisateur. Si l'application effectue une requête non spécifique, par exemple avec un SSID ou un modèle BSSID, l'utilisateur doit approuver la demande.

Exemple de code

L'exemple de code suivant montre comment se connecter à un réseau ouvert avec le préfixe SSID "test" et l'OUI BSSID "10:03:23":

Kotlin

val specifier = WifiNetworkSpecifier.Builder()
    .setSsidPattern(PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
    .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
    .build()

val request = NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .setNetworkSpecifier(specifier)
    .build()

val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

val networkCallback = object : ConnectivityManager.NetworkCallback() {
    ...
    override fun onAvailable(network: Network?) {
        // do success processing here..
    }

    override fun onUnavailable() {
        // do failure processing here..
    }
    ...
}
connectivityManager.requestNetwork(request, networkCallback)
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback)

Java

final NetworkSpecifier specifier =
  new WifiNetworkSpecifier.Builder()
  .setSsidPattern(new PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
  .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
  .build();

final NetworkRequest request =
  new NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
  .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .setNetworkSpecifier(specifier)
  .build();

final ConnectivityManager connectivityManager = (ConnectivityManager)
  context.getSystemService(Context.CONNECTIVITY_SERVICE);

final NetworkCallback networkCallback = new NetworkCallback() {
  ...
  @Override
  void onAvailable(...) {
      // do success processing here..
  }

  @Override
  void onUnavailable(...) {
      // do failure processing here..
  }
  ...
};
connectivityManager.requestNetwork(request, networkCallback);
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback);