Sui dispositivi con Android 10 (livello API 29) e versioni successive, puoi utilizzare una nuova API peer to peer per eseguire l'inizializzazione della configurazione per i dispositivi secondari come Chromecast e l'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 della rete Wi-Fi utilizzando
WifiNetworkSpecifier.Builder
.Imposta un filtro di rete in base alle reti a cui connetterti, insieme alle e credenziali.
Scegli una combinazione di
SSID
,SSID pattern
,BSSID
, eBSSID pattern
per impostare il filtro di rete in ogni richiesta, rispettando i seguenti requisiti:- Ogni richiesta deve fornire almeno uno dei seguenti valori:
SSID
,SSID pattern
,BSSID
oppureBSSID pattern
- Ogni richiesta può impostare solo
SSID
oSSID pattern
- Ogni richiesta può impostare solo
BSSID
oBSSID pattern
- Ogni richiesta deve fornire almeno uno dei seguenti valori:
Aggiungi gli indicatori alla richiesta di rete insieme a un
NetworkCallback
per monitorare lo stato della richiesta.Se l'utente accetta la richiesta e la connessione alla rete riuscito,
NetworkCallback.onAvailable()
viene richiamato sull'oggetto callback. Se l'utente rifiuta la richiesta o se la connessione alla rete non va a buon fine, viene invocatoNetworkCallback.onUnavailable()
sull'oggetto callback.
L'avvio della richiesta di connessione a un dispositivo peer avvia una finestra di dialogo nella stesso dispositivo, da cui l'utente può accettare la richiesta di connessione.
Elusione dell'approvazione degli utenti
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 determinato punto di accesso. Se l'app effettua una richiesta specifica per collegarsi di nuovo al punto di accesso, il dispositivo salta la fase di approvazione dell'utente e si connette automaticamente alla rete. Se l'utente sceglie di eliminare rete durante la connessione a una rete richiesta dall'API, viene archiviata l'approvazione per quella combinazione di app e rete viene rimossa ed eventuali future richiesta dall'app deve essere nuovamente approvata dall'utente. Se l'app effettua una richiesta non specifica, ad esempio con un pattern SSID o BSSID, il 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);