Sur les appareils Android 10 (niveau d'API 29) ou version ultérieure, vous pouvez utiliser une nouvelle API peer-to-peer pour
configuration d'amorçage pour les appareils secondaires tels que Chromecast et Google Home
matériel. Cette fonctionnalité permet à votre application d'inviter l'utilisateur à modifier l'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éer un spécificateur de réseau Wi-Fi à l'aide de
WifiNetworkSpecifier.Builder
Définissez un filtre de réseau correspondant aux réseaux auxquels se connecter, ainsi que les identifiants de connexion.
Choisissez une combinaison de
SSID
,SSID pattern
,BSSID
, etBSSID pattern
de définir le filtre de réseau dans chaque requête, sous réserve des conditions suivantes configuration requise:- Chaque demande doit fournir au moins l'un des éléments suivants :
SSID
,SSID pattern
,BSSID
ouBSSID pattern
- Chaque requête ne peut définir qu'un seul des types suivants :
SSID
ouSSID pattern
- Chaque requête ne peut définir qu'un seul des types suivants :
BSSID
ouBSSID pattern
- Chaque demande doit fournir au moins l'un des éléments suivants :
Ajoutez les spécificateurs à la requête réseau, ainsi qu'une
NetworkCallback
pour suivre l'état de la requête.Si l'utilisateur accepte la demande et que la connexion au réseau est réussi,
NetworkCallback.onAvailable()
est appelé sur l'objet de rappel. Si l'utilisateur refuse la demande ou si le la connexion au réseau échoue,NetworkCallback.onUnavailable()
est appelé sur l'objet de rappel.
Lorsque vous lancez la demande de connexion à un appareil pair, une boîte de dialogue s'affiche sur le sur le même appareil, à partir duquel l'utilisateur peut accepter la demande de connexion.
Ignorer l'approbation de l'utilisateur
Une fois que l'utilisateur a approuvé un réseau auquel se connecter en réponse à la demande d'un application spécifique, l’appareil stocke l’approbation du point d’accès particulier. Si l'application envoie une demande spécifique à se connecter à nouveau à 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 tout en étant connecté à un réseau demandé par l'API, celui-ci l'approbation de cette combinaison d'applications et de réseaux est supprimée, et toute approbation ultérieure de l'application doit être de nouveau approuvée par l'utilisateur. Si l'application effectue une requête non spécifique, par exemple avec un schéma SSID ou BSSID, le paramètre doit approuver la demande.
Exemple de code
L'exemple de code suivant montre comment se connecter à un réseau ouvert avec un SSID.
préfixe 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);