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 Bootstrap-Konfiguration für sekundäre Geräte wie Chromecast und Google Home Hardware. Mit dieser Funktion kann deine App den Nutzer auffordern, den Zugriff zu ändern mit dem das Gerät über WifiNetworkSpecifier zum Beschreiben der Eigenschaften eines angeforderten Netzwerks.

So verwenden Sie diese API:

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

  2. Legen Sie einen Netzwerkfilter fest, um die Netzwerke zu finden, zu denen eine Verbindung hergestellt werden soll, sowie erforderliche Anmeldedaten.

  3. Wählen Sie eine Kombination aus SSID, SSID pattern, BSSID, und BSSID pattern den Netzwerkfilter in jeder Anfrage festzulegen. Dabei gilt Folgendes: Anforderungen:

    • Jede Anfrage sollte mindestens eines der folgenden Werte enthalten: SSID, SSID pattern, BSSID oder BSSID pattern
    • Für jede Anfrage kann nur entweder SSID oder SSID pattern festgelegt werden
    • Für jede Anfrage kann nur entweder BSSID oder BSSID pattern festgelegt werden
  4. Fügen Sie der Netzwerkanfrage die Spezifizierer zusammen mit einem NetworkCallback Instanz, 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 Verbindung zum Netzwerk nicht erfolgreich, NetworkCallback.onUnavailable() wird im 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 die solange eine Verbindung zu einem von der API angeforderten Netzwerk besteht, Genehmigung für diese Kombination aus App und Werbenetzwerk entfernt wird Anfrage von 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

Im folgenden Codebeispiel wird gezeigt, 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);