Sur les appareils équipés d'Android 10 (niveau d'API 29) ou d'une 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 :
Créez un spécificateur de réseau Wi-Fi à l'aide de
WifiNetworkSpecifier.Builder
.Définissez un filtre réseau pour faire correspondre les réseaux auxquels vous souhaitez vous connecter, ainsi que les identifiants requis.
Choisissez une combinaison de
SSID
,SSID pattern
,BSSID
etBSSID pattern
pour définir le filtre réseau dans chaque requête, en respectant les exigences suivantes :- Chaque requête doit fournir au moins l'une des valeurs suivantes :
SSID
,SSID pattern
,BSSID
ouBSSID pattern
. - Chaque requête ne peut définir qu'un seul des éléments
SSID
ouSSID pattern
. - Chaque requête ne peut définir qu'un seul des éléments
BSSID
ouBSSID pattern
.
- Chaque requête doit fournir au moins l'une des valeurs suivantes :
Ajoutez les spécificateurs à la requête réseau avec une instance
NetworkCallback
pour suivre l'état de la requête.Si l'utilisateur accepte la demande et que la connexion au réseau est établie,
NetworkCallback.onAvailable()
est appelé sur l'objet de rappel. Si l'utilisateur refuse la demande ou si la connexion au réseau échoue,NetworkCallback.onUnavailable()
est appelé sur l'objet de rappel.
Lorsque vous demandez à vous connecter à un appareil pair, une boîte de dialogue s'affiche sur l'appareil en question, à partir de laquelle l'utilisateur de cet appareil peut accepter la demande de connexion.
Contourner l'approbation de l'utilisateur
Une fois que l'utilisateur a approuvé la connexion à un réseau en réponse à une demande 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 pour se reconnecter à ce point d'accès, 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 alors qu'il est connecté à un réseau demandé par l'API, l'approbation stockée pour cette combinaison d'application et de réseau est supprimée, et toute demande future de l'application devra à nouveau être approuvée par l'utilisateur. Si l'application effectue une demande non spécifique, par exemple avec un modèle SSID ou BSSID, l'utilisateur doit approuver la demande.
Exemple de code
L'exemple de code suivant montre comment se connecter à un réseau ouvert avec un préfixe SSID de "test"
et un OUI BSSID de "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);