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

Auf Geräten mit Android 10 (API-Level 29) und höher kannst du eine neue Peer-to-Peer-API verwenden, um die 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 Zugriffspunkt zu ändern, mit dem das Gerät verbunden ist. Dazu wird WifiNetworkSpecifier verwendet, um die Eigenschaften eines angeforderten Netzwerks zu beschreiben.

So verwenden Sie diese API:

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

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

  3. Entscheiden Sie sich für eine Kombination aus SSID, SSID pattern, BSSID und BSSID pattern, um den Netzwerkfilter in jeder Anfrage festzulegen. Dabei gelten die folgenden Anforderungen:

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

    Wenn der Nutzer die Anfrage akzeptiert und die Verbindung zum Netzwerk erfolgreich hergestellt wurde, wird NetworkCallback.onAvailable() für das Callback-Objekt aufgerufen. Wenn der Nutzer die Anfrage ablehnt oder die Verbindung zum Netzwerk nicht hergestellt werden kann, wird NetworkCallback.onUnavailable() für das Callback-Objekt aufgerufen.

Wenn die Anfrage zum Herstellen einer Verbindung mit einem Peer-Gerät initiiert wird, wird auf diesem Gerät ein Dialogfeld geöffnet, in dem der Nutzer des Geräts die Verbindungsanfrage annehmen kann.

Umgehung der Nutzergenehmigung

Sobald der Nutzer die Verbindung zu einem Netzwerk als Antwort auf eine Anfrage einer bestimmten App genehmigt, speichert das Gerät die Genehmigung für den jeweiligen Zugriffspunkt. Wenn die App eine spezifische Anfrage stellt, um sich wieder mit diesem Zugangspunkt zu verbinden, überspringt das Gerät die Phase der Nutzergenehmigung und verbindet sich automatisch mit dem Netzwerk. Wenn der Nutzer das Netzwerk vergisst, 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. Jede zukünftige Netzwerkanfrage der App muss dann vom Nutzer noch einmal genehmigt werden. Wenn die App eine unspezifische Anfrage stellt, z. B. mit einem SSID- oder BSSID-Muster, muss der Nutzer die Anfrage genehmigen.

Codebeispiel

Im folgenden Codebeispiel wird gezeigt, wie eine Verbindung zu einem offenen Netzwerk mit dem SSID-Präfix "test" und der BSSID-OUI "10:03:23" hergestellt wird:

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