Sui dispositivi con Android 10 (livello API 29) e versioni successive, puoi utilizzare una nuova API peer-to-peer per eseguire il bootstrap della configurazione per i dispositivi secondari, come l'hardware di Chromecast e Google Home. Questa funzionalità consente alla tua app di chiedere all'utente di cambiare il punto di accesso a cui è connesso il dispositivo utilizzando WifiNetworkSpecifier per descrivere le proprietà di una rete richiesta.
Per utilizzare questa API, segui questi passaggi:
Crea un identificatore di rete Wi-Fi utilizzando
WifiNetworkSpecifier.Builder.Imposta un filtro di rete per trovare le reti a cui connetterti, insieme alle credenziali richieste.
Scegli una combinazione di
SSID,SSID pattern,BSSIDeBSSID patternper impostare il filtro di rete in ogni richiesta, in base ai seguenti requisiti:- Ogni richiesta deve fornire almeno uno dei seguenti elementi:
SSID,SSID pattern,BSSIDoBSSID pattern - Ogni richiesta può impostare solo
SSIDoSSID pattern - Ogni richiesta può impostare solo
BSSIDoBSSID pattern
- Ogni richiesta deve fornire almeno uno dei seguenti elementi:
Aggiungi gli identificatori alla richiesta di rete insieme a un'istanza
NetworkCallbackper monitorare lo stato della richiesta.Se l'utente accetta la richiesta e la connessione alla rete va a buon fine, viene richiamato
NetworkCallback.onAvailable()sull'oggetto di callback. Se l'utente rifiuta la richiesta o se la connessione alla rete non va a buon fine, viene richiamatoNetworkCallback.onUnavailable()sull'oggetto di callback.
L'avvio della richiesta di connessione a un dispositivo peer apre una finestra di dialogo sullo stesso dispositivo, da cui l'utente può accettare la richiesta di connessione.
Bypassing user approval
Una volta che l'utente approva una rete a cui connettersi in risposta a una richiesta di un'app specifica, il dispositivo memorizza l'approvazione per quel particolare punto di accesso. Se l'app effettua una richiesta specifica per connettersi nuovamente a quel punto di accesso, il dispositivo salta la fase di approvazione dell'utente e si connette automaticamente alla rete. Se l'utente sceglie di eliminare la rete mentre è connesso a una rete richiesta dall'API, l'approvazione memorizzata per la combinazione di app e rete viene rimossa e qualsiasi richiesta futura dell'app deve essere nuovamente approvata dall'utente. Se l'app effettua una richiesta non specifica, ad esempio con un pattern SSID o BSSID, l'utente deve approvare la richiesta.
Esempio di codice
Il seguente esempio di codice mostra come connettersi a una rete aperta con un prefisso SSID "test" e un 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);