API Wi-Fi Network Request per la connettività peer-to-peer

Sui dispositivi Android 10 (livello API 29) e versioni successive, puoi utilizzare una nuova API peer-to-peer per eseguire l'avvio della configurazione per i dispositivi secondari, come Chromecast e l'hardware Google Home. Questa funzionalità consente all'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:

  1. Crea un indicatore di rete Wi-Fi utilizzando WifiNetworkSpecifier.Builder.

  2. Imposta un filtro di rete in modo che corrisponda alle reti a cui connetterti, insieme alle credenziali richieste.

  3. Scegli una combinazione di SSID, SSID pattern, BSSID e BSSID pattern per impostare il filtro di rete in ogni richiesta, in base ai seguenti requisiti:

    • Ogni richiesta deve fornire almeno uno dei seguenti valori: SSID, SSID pattern, BSSID o BSSID pattern
    • Per ogni richiesta è possibile impostare un solo valore tra SSID o SSID pattern
    • Per ogni richiesta è possibile impostare un solo valore tra BSSID o BSSID pattern
  4. Aggiungi gli indicatori 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, NetworkCallback.onAvailable() viene richiamato 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 avvia una finestra di dialogo sullo stesso dispositivo, da cui l'utente del dispositivo 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'app specifica, il dispositivo memorizza l'approvazione per il punto di accesso specifico. Se l'app effettua una richiesta specifica di connettersi nuovamente a quel punto di accesso, il dispositivo salta la fase di approvazione degli utenti e si connette automaticamente alla rete. Se l'utente sceglie di eliminare la rete mentre è connesso a una rete richiesta dall'API, questa approvazione memorizzata per quella combinazione di app e rete viene rimossa e qualsiasi richiesta futura da parte dell'app deve essere approvata nuovamente 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 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);