Sui dispositivi con Android 10 (livello API 29) e versioni successive, puoi utilizzare una nuova API peer-to-peer per avviare la configurazione di dispositivi secondari come Chromecast e hardware Google Home. Questa funzionalità consente alla tua app di chiedere 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 uno specificatore di rete Wi-Fi utilizzando
WifiNetworkSpecifier.Builder.Imposta un filtro di rete per trovare le reti a cui connetterti, insieme alle credenziali richieste.
Decidi una combinazione di
SSID,SSID pattern,BSSID, eBSSID patternper 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
SSIDoSSID pattern - Ogni richiesta può impostare solo uno tra
BSSIDoBSSID pattern
- Ogni richiesta deve fornire almeno uno tra
Aggiungi gli specificatori alla richiesta di rete insieme a un'
NetworkCallbackistanza 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()sull'oggetto di callback. Se l'utente rifiuta la richiesta o se la connessione alla rete non va a buon fine,NetworkCallback.onUnavailable()viene richiamato 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 del dispositivo può accettare la richiesta di connessione.
Ignorare l'approvazione dell'utente
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 il punto di accesso specifico. Se l'app effettua di nuovo una richiesta specifica per connettersi 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 dimenticare 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 approvata di nuovo dall'utente. Se l'app effettua una richiesta non specifica, ad esempio con un SSID o un pattern BSSID, l'utente deve approvare la richiesta.
Esempio di codice
L'esempio di codice seguente 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);