Sui dispositivi Android 10 (livello API 29) e versioni successive, puoi utilizzare una nuova API peer-to-peer per
configurazione del bootstrap per i dispositivi secondari come Chromecast e Google Home
hardware. Questa funzionalità consente alla tua app di richiedere all'utente di modificare l'accesso
punto di accesso a cui è connesso il dispositivo utilizzando
WifiNetworkSpecifier
per descrivere le proprietà di una rete richiesta.
Per utilizzare questa API:
Creare un indicatore di 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
di impostare il filtro di rete in ogni richiesta, in base alle seguenti condizioni: requisiti:- Ogni richiesta deve fornire almeno uno dei seguenti valori:
SSID
,SSID pattern
,BSSID
oppureBSSID pattern
- Per ogni richiesta è possibile impostare un solo valore tra
SSID
oSSID pattern
- Per ogni richiesta è possibile impostare un solo valore tra
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 connessione alla rete non riesce,NetworkCallback.onUnavailable()
viene richiamato 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
Dopo che l'utente approva una rete a cui connettersi in risposta a una richiesta da un un'app specifica, il dispositivo memorizza l'approvazione per quel particolare punto di accesso. Se l'app invia una richiesta specifica a 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 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 SSID
prefisso di "test"
e una 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);