Wi-Fi Network Request API für Peer-to-Peer-Verbindungen

Auf Geräten mit Android 10 (API-Level 29) und höher können Sie eine neue Peer-to-Peer-API für die Bootstrap-Konfiguration für sekundäre Geräte wie Chromecast und Google Home-Hardware verwenden. Mit dieser Funktion kann Ihre App den Nutzer auffordern, den Zugangspunkt, mit dem das Gerät verbunden ist, zu ändern. Dazu werden mit WifiNetworkSpecifier die Eigenschaften eines angeforderten Netzwerks beschrieben.

So verwenden Sie diese API:

  1. Erstellen Sie mit WifiNetworkSpecifier.Builder einen WLAN-Spezifizierer.

  2. Legen Sie einen Netzwerkfilter fest, um die Netzwerke, zu denen eine Verbindung hergestellt werden soll, zusammen mit den erforderlichen Anmeldedaten abzugleichen.

  3. Legen Sie eine Kombination aus SSID, SSID pattern, BSSID und BSSID pattern fest, um den Netzwerkfilter in jeder Anfrage festzulegen. Dabei gelten die folgenden Anforderungen:

    • Jede Anfrage sollte mindestens eine der folgenden Optionen enthalten: SSID, SSID pattern, BSSID oder BSSID pattern
    • In jeder Anfrage kann entweder SSID oder SSID pattern festgelegt werden
    • In jeder Anfrage kann entweder BSSID oder BSSID pattern festgelegt werden
  4. Fügen Sie der Netzwerkanfrage die Spezifizierer zusammen mit einer NetworkCallback-Instanz hinzu, um den Status der Anfrage zu verfolgen.

    Wenn der Nutzer die Anfrage akzeptiert und die Netzwerkverbindung hergestellt wurde, wird NetworkCallback.onAvailable() auf dem Callback-Objekt aufgerufen. Wenn der Nutzer die Anfrage ablehnt oder die Netzwerkverbindung nicht hergestellt werden kann, wird NetworkCallback.onUnavailable() auf dem Callback-Objekt aufgerufen.

Wenn Sie die Anfrage zum Herstellen einer Verbindung zu einem Peer-Gerät initiieren, wird auf demselben Gerät ein Dialogfeld geöffnet, von dem aus der Nutzer dieses Geräts die Verbindungsanfrage annehmen kann.

Umgehen der Nutzergenehmigung

Sobald der Nutzer ein Netzwerk für die Verbindung als Reaktion auf eine Anfrage von einer bestimmten App genehmigt, speichert das Gerät die Genehmigung für den jeweiligen Zugangspunkt. Wenn die App eine bestimmte Anfrage zum erneuten Herstellen einer Verbindung zu diesem Zugangspunkt stellt, überspringt das Gerät die Genehmigungsphase des Nutzers und stellt automatisch eine Verbindung zum Netzwerk her. Wenn der Nutzer das Netzwerk verlässt, während er mit einem von der API angeforderten Netzwerk verbunden ist, wird diese gespeicherte Genehmigung für diese Kombination aus App und Netzwerk entfernt und künftige Anfragen von der App müssen noch einmal vom Nutzer genehmigt werden. Wenn die App eine nicht spezifische Anfrage sendet, z. B. mit einem SSID- oder BSSID-Muster, muss der Nutzer die Anfrage genehmigen.

Codebeispiel

Das folgende Codebeispiel zeigt, wie Sie eine Verbindung zu einem offenen Netzwerk mit dem SSID-Präfix "test" und der BSSID OUI von "10:03:23" herstellen:

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);