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 durchzuführen. Mit dieser Funktion kann Ihre App den Nutzer auffordern, den Zugangspunkt zu ändern, mit dem das Gerät verbunden ist. Dazu verwendet sie WifiNetworkSpecifier
, um die Eigenschaften eines angeforderten Netzwerks zu beschreiben.
So verwenden Sie diese API:
Erstellen Sie mit
WifiNetworkSpecifier.Builder
einen WLAN-Spezifizierer.Legen Sie einen Netzwerkfilter fest, um die Netzwerke, zu denen eine Verbindung hergestellt werden soll, und die erforderlichen Anmeldedaten zu finden.
Entscheiden Sie sich für eine Kombination aus
SSID
,SSID pattern
,BSSID
undBSSID pattern
, um den Netzwerkfilter in jeder Anfrage festzulegen. Beachten Sie dabei die folgenden Anforderungen:- Für jede Anfrage sollte mindestens eines der folgenden Werte angegeben werden:
SSID
,SSID pattern
,BSSID
oderBSSID pattern
. - Für jede Anfrage kann nur entweder
SSID
oderSSID pattern
festgelegt werden - Für jede Anfrage kann nur entweder
BSSID
oderBSSID pattern
festgelegt werden
- Für jede Anfrage sollte mindestens eines der folgenden Werte angegeben werden:
Fügen Sie der Netzwerkanfrage die Bezeichner zusammen mit einer
NetworkCallback
-Instanz hinzu, um den Status der Anfrage zu verfolgen.Wenn der Nutzer die Anfrage annimmt und die Verbindung zum Netzwerk erfolgreich ist, wird
NetworkCallback.onAvailable()
für das Callback-Objekt aufgerufen. Wenn der Nutzer die Anfrage ablehnt oder die Verbindung zum Netzwerk nicht erfolgreich ist, wirdNetworkCallback.onUnavailable()
im Callback-Objekt aufgerufen.
Wenn Sie die Anfrage zum Herstellen einer Verbindung zu einem Peer-Gerät initiieren, wird auf diesem Gerät ein Dialogfeld geöffnet, über das der Nutzer dieses Geräts die Verbindungsanfrage annehmen kann.
Umgehen der Nutzergenehmigung
Sobald der Nutzer ein Netzwerk für die Verbindung als Antwort 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 Verbinden mit diesem Zugangspunkt sendet, überspringt das Gerät die Genehmigungsphase des Nutzers und stellt automatisch eine Verbindung zum Netzwerk her. Wenn der Nutzer das Netzwerk entfernt, während er mit einem von der API angeforderten Netzwerk verbunden ist, wird die gespeicherte Genehmigung für diese Kombination aus Anwendung und Netzwerk entfernt. Jede weitere Anfrage von der Anwendung muss noch einmal vom Nutzer genehmigt werden. Wenn die Anwendung eine unspezifische 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 "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);