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 verwenden, um die Bootstrap-Konfiguration für sekundäre Geräte wie Chromecast und Google Home-Hardware zu starten. Mit dieser Funktion kann Ihre App den Nutzer auffordern, den Zugangspunkt zu ändern, mit dem das Gerät verbunden ist. Verwenden Sie dazu WifiNetworkSpecifier, um Eigenschaften eines angeforderten Netzwerks zu beschreiben.

So verwenden Sie diese API:

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

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

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

    • Für jede Anfrage muss mindestens eine der folgenden Optionen angegeben werden: SSID, SSID pattern, BSSID oder BSSID pattern.
    • Für jede Anfrage kann nur entweder SSID oder SSID pattern festgelegt werden
    • Pro Anfrage kann nur BSSID oder BSSID pattern festgelegt werden.
  4. Fügen Sie der Netzwerkanfrage die Spezifikationen zusammen mit einer NetworkCallback-Instanz hinzu, um den Status der Anfrage zu verfolgen.

    Wenn der Nutzer die Anfrage akzeptiert und die Netzwerkverbindung erfolgreich war, NetworkCallback.onAvailable() wird im Callback-Objekt aufgerufen. Wenn der Nutzer die Anfrage ablehnt oder die Verbindung zum Netzwerk fehlschlägt, wird NetworkCallback.onUnavailable() auf dem Callback-Objekt aufgerufen.

Beim Initiieren der Anfrage zum Verbinden mit einem Peer-Gerät wird ein Dialogfeld auf der und auf demselben Gerät, über das der Nutzer dieses Geräts die Verbindungsanfrage annehmen kann.

Umgehen der Nutzergenehmigung

Sobald der Nutzer als Reaktion auf eine Anfrage von einem Netzwerk die Verbindung mit einem Netzwerk genehmigt hat, App verwendet wird, speichert das Gerät die Genehmigung für den jeweiligen Zugangspunkt. Wenn die App eine bestimmte Anfrage an wieder eine Verbindung zu diesem Zugangspunkt herstellen, überspringt das Gerät die Genehmigungsphase des Nutzers und stellt automatisch eine Verbindung zum Netzwerk her. Wenn der Nutzer das Netzwerk vergisst, während er mit einem von der API angeforderten Netzwerk verbunden ist, wird die gespeicherte Genehmigung für diese Kombination aus App und Netzwerk entfernt und jede zukünftige Anfrage der App muss vom Nutzer noch einmal genehmigt werden. Wenn die App eine unspezifische Anfrage sendet, z. B. mit einem SSID- oder BSSID-Muster, Nutzer müssen die Anfrage genehmigen.

Codebeispiel

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

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