Sui dispositivi Android 10 (livello API 29) e versioni successive, puoi utilizzare una nuova API peer-to-peer per eseguire il bootstrap della configurazione per dispositivi secondari come Chromecast e Google Home. Questa funzionalità consente alla tua app di richiedere all'utente di modificare il punto di accesso a cui è connesso il dispositivo utilizzando WifiNetworkSpecifier
per descrivere le proprietà di una rete richiesta.
Per utilizzare questa API:
Crea un specificatore di rete Wi-Fi utilizzando
WifiNetworkSpecifier.Builder
.Imposta un filtro di rete per associare le reti a cui connetterti, insieme alle credenziali richieste.
Scegli una combinazione di
SSID
,SSID pattern
,BSSID
eBSSID pattern
per impostare il filtro di rete in ogni richiesta, in base ai seguenti requisiti:- Ogni richiesta deve fornire almeno uno tra
SSID
,SSID pattern
,BSSID
oBSSID pattern
- Ogni richiesta può impostare solo uno tra
SSID
oSSID pattern
- Ogni richiesta può impostare solo uno tra
BSSID
oBSSID pattern
- Ogni richiesta deve fornire almeno uno tra
Aggiungi gli specificatiri alla richiesta di rete insieme a un'istanza
NetworkCallback
per monitorare lo stato della richiesta.Se l'utente accetta la richiesta e la connessione alla rete va a buon fine, viene richiamato
NetworkCallback.onAvailable()
nell'oggetto callback. Se l'utente rifiuta la richiesta o se la connessione alla rete non va a buon fine, viene richiamatoNetworkCallback.onUnavailable()
nell'oggetto callback.
L'avvio della richiesta di connessione a un dispositivo peer avvia una finestra di dialogo sullo stesso dispositivo, da cui l'utente del dispositivo può accettare la richiesta di connessione.
Bypass dell'approvazione dell'utente
Dopo che l'utente approva una rete a cui connettersi in risposta a una richiesta di un'app specifica, il dispositivo memorizza l'approvazione per il punto di accesso specifico. Se l'app invia una richiesta specifica per connettersi di nuovo a quel punto di accesso, il dispositivo ignora 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 archiviata per quella combinazione di app e rete viene rimossa e qualsiasi richiesta futura proveniente dall'app deve essere nuovamente approvata dall'utente. Se l'app fa 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 di "test"
e un'OUI BSSID di "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);