Auf Geräten mit Android 10 (API-Level 29) und höher können Sie 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 werden mit WifiNetworkSpecifier
Eigenschaften eines angeforderten Netzwerks beschrieben.
So verwenden Sie diese API:
Erstellen Sie mit
WifiNetworkSpecifier.Builder
einen WLAN-Spezifizierer.Legen Sie einen Netzwerkfilter fest, um die Netzwerke zu finden, mit denen eine Verbindung hergestellt werden soll, und geben Sie die erforderlichen Anmeldedaten an.
Legen Sie eine Kombination aus
SSID
,SSID pattern
,BSSID
undBSSID pattern
fest, 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
oderBSSID pattern
. - Pro Anfrage kann nur einer der beiden Parameter
SSID
oderSSID pattern
festgelegt werden. - Pro Anfrage kann nur einer der beiden Parameter
BSSID
oderBSSID pattern
festgelegt werden.
- Für jede Anfrage muss mindestens eine der folgenden Optionen angegeben werden:
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 Verbindung zum Netzwerk erfolgreich hergestellt wird, wird
NetworkCallback.onAvailable()
für das Callback-Objekt aufgerufen. Wenn der Nutzer die Anfrage ablehnt oder die Verbindung zum Netzwerk nicht hergestellt werden kann, wirdNetworkCallback.onUnavailable()
für das Callback-Objekt aufgerufen.
Wenn Sie die Anfrage zum Herstellen einer Verbindung zu einem Peergerät initiieren, wird auf demselben Gerät ein Dialogfeld geöffnet, in dem der Nutzer des Geräts die Verbindungsanfrage annehmen kann.
Umgehen der Nutzergenehmigung
Sobald der Nutzer ein Netzwerk genehmigt hat, mit dem eine Verbindung hergestellt werden soll, speichert das Gerät die Genehmigung für den jeweiligen Zugriffspunkt. Wenn die App eine bestimmte Anfrage stellt, um sich wieder mit diesem Zugriffspunkt zu verbinden, überspringt das Gerät die Phase der Nutzergenehmigung 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. Zukünftige Anfragen der App müssen dann wieder vom Nutzer genehmigt werden. Wenn die App eine nicht spezifische Anfrage stellt, 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 "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);