Auf Geräten mit Android 10 (API-Level 29) und höher kann Ihre App Netzwerk-Anmeldedaten für ein Gerät hinzufügen, damit es sich automatisch mit einem WLAN-Zugangspunkt verbindet. Mit WifiNetworkSuggestion
können Sie Vorschläge für das Netzwerk angeben, mit dem eine Verbindung hergestellt werden soll.
Die Plattform entscheidet letztendlich, welcher Zugriffspunkt akzeptiert wird, basierend auf den Eingaben Ihrer App und anderer Apps.
Unter Android 11 (API‑Level 30) und höher:
- Die Bereitstellung eines
PasspointConfiguration
wird von der Vorschlags-API unterstützt. Vor Android 11 musste für die Bereitstellung einesPasspointConfiguration
dieaddOrUpdatePasspointConfiguration()
API verwendet werden. - Das Framework erzwingt Sicherheitsanforderungen für TLS-basierte Vorschläge für Unternehmen (EAP-TLS, EAP-TTLS und EAP-PEAP). Für Vorschläge für solche Netzwerke müssen ein
Root CA certificate
und einserver domain name
festgelegt werden.
- Das Framework erzwingt die Eigentumsanforderungen für EAP-SIM-basierte Unternehmensvorschläge (EAP-SIM, EAP-AKA, EAP-AKA-PRIME). Solche Vorschläge sind nur für Apps zulässig, die vom Mobilfunkanbieter signiert wurden.
- Vorschlägen, die von einer vom Mobilfunkanbieter signierten App bereitgestellt werden, weist das Framework automatisch eine Mobilfunkanbieter-ID zu, die der Mobilfunkanbieter-Signierung der App entspricht. Solche Vorschläge werden automatisch deaktiviert, wenn die entsprechende SIM-Karte aus dem Gerät entfernt wird.
Unter Android 12 (API‑Level 31) und höher:
Zusätzliche Privatsphäre kann durch nicht persistente MAC-Randomisierung aktiviert werden, bei der die zufällige MAC-Adresse regelmäßig neu zufällig generiert wird. Verwenden Sie
setMacRandomizationSetting
, um den Grad der Randomisierung für Ihr Netzwerk anzugeben.isPasspointTermsAndConditionsSupported()
: Nutzungsbedingungen ist eine Passpoint-Funktion, mit der Netzwerkbereitstellungen unsichere Captive Portale, die offene Netzwerke verwenden, durch ein sicheres Passpoint-Netzwerk ersetzen können. Der Nutzer erhält eine Benachrichtigung, wenn er die Nutzungsbedingungen akzeptieren muss. Apps, die Passpoint-Netzwerke vorschlagen, für die Nutzungsbedingungen gelten, müssen zuerst diese API aufrufen, um sicherzustellen, dass das Gerät die Funktion unterstützt. Wenn das Gerät die Funktion nicht unterstützt, kann es keine Verbindung zu diesem Netzwerk herstellen. In diesem Fall muss ein alternatives oder altes Netzwerk vorgeschlagen werden.isDecoratedIdentitySupported()
: Bei der Authentifizierung in Netzwerken mit einer Präfixdekoration können Netzwerkbetreiber mit dem dekorierten Identitätspräfix die Network Access Identifier (NAI) aktualisieren, um explizites Routing über mehrere Proxys in einem AAA-Netzwerk durchzuführen (weitere Informationen finden Sie in RFC 7542).In Android 12 wird diese Funktion implementiert, um der WBA-Spezifikation für PPS-MO-Erweiterungen zu entsprechen. Apps, die Passpoint-Netzwerke vorschlagen, für die eine dekorierte Identität erforderlich ist, müssen diese API zuerst aufrufen, um sicherzustellen, dass das Gerät die Funktion unterstützt. Wenn das Gerät die Funktion nicht unterstützt, wird die Identität nicht ergänzt und die Authentifizierung im Netzwerk schlägt möglicherweise fehl.
Um einen Passpoint-Vorschlag zu erstellen, müssen Apps die Klassen PasspointConfiguration
, Credential
und HomeSp
verwenden. Diese Klassen beschreiben das Passpoint-Profil, das in der Passpoint-Spezifikation der Wi-Fi Alliance definiert ist.
Das folgende Codebeispiel zeigt, wie Anmeldedaten für ein offenes Netzwerk, ein WPA2-Netzwerk, ein WPA3-Netzwerk und ein Passpoint-Netzwerk angegeben werden:
Kotlin
val suggestion1 = WifiNetworkSuggestion.Builder() .setSsid("test111111") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestion2 = WifiNetworkSuggestion.Builder() .setSsid("test222222") .setWpa2Passphrase("test123456") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestion3 = WifiNetworkSuggestion.Builder() .setSsid("test333333") .setWpa3Passphrase("test6789") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val passpointConfig = PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration val suggestion4 = WifiNetworkSuggestion.Builder() .setPasspointConfig(passpointConfig) .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestionsList = listOf(suggestion1, suggestion2, suggestion3, suggestion4); val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager; val status = wifiManager.addNetworkSuggestions(suggestionsList); if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) { // do error handling here } // Optional (Wait for post connection broadcast to one of your suggestions) val intentFilter = IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION); val broadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (!intent.action.equals(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) { return; } // do post connect processing here } }; context.registerReceiver(broadcastReceiver, intentFilter);
Java
final WifiNetworkSuggestion suggestion1 = new WifiNetworkSuggestion.Builder() .setSsid("test111111") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final WifiNetworkSuggestion suggestion2 = new WifiNetworkSuggestion.Builder() .setSsid("test222222") .setWpa2Passphrase("test123456") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final WifiNetworkSuggestion suggestion3 = new WifiNetworkSuggestion.Builder() .setSsid("test333333") .setWpa3Passphrase("test6789") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final PasspointConfiguration passpointConfig = new PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration final WifiNetworkSuggestion suggestion4 = new WifiNetworkSuggestion.Builder() .setPasspointConfig(passpointConfig) .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final List<WifiNetworkSuggestion> suggestionsList = new ArrayList<WifiNetworkSuggestion> {{ add(suggestion1); add(suggestion2); add(suggestion3); add(suggestion4); }}; final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); final int status = wifiManager.addNetworkSuggestions(suggestionsList); if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) { // do error handling here… } // Optional (Wait for post connection broadcast to one of your suggestions) final IntentFilter intentFilter = new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION); final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (!intent.getAction().equals( WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) { return; } // do post connect processing here... } }; context.registerReceiver(broadcastReceiver, intentFilter);
Unmittelbar nachdem die App zum ersten Mal einen Vorschlag platziert hat, wird der Nutzer benachrichtigt. Der Benachrichtigungstyp hängt von der Android-Version ab, die auf dem Gerät ausgeführt wird:
- Unter Android 11 (API-Level 30) und höher wird dem Nutzer ein Dialogfeld angezeigt, wenn die App im Vordergrund ausgeführt wird, und eine Benachrichtigung, wenn die App im Hintergrund ausgeführt wird.
- Unter Android 10 (API-Level 29) wird dem Nutzer eine Benachrichtigung angezeigt, unabhängig davon, ob die App im Vordergrund oder im Hintergrund ausgeführt wird.
Wenn die Plattform eine Verbindung zu einem der Netzwerkvorschläge herstellt, wird in den Einstellungen Text angezeigt, der die Netzwerkverbindung der entsprechenden Vorschlags-App zuordnet.
Trennen der Verbindung durch Nutzer
Wenn der Nutzer die WLAN-Auswahl verwendet, um die Verbindung zu einem der Netzwerkvorschläge zu trennen, während er damit verbunden ist, wird dieses Netzwerk ignoriert, solange es sich noch in Reichweite befindet. Während dieses Zeitraums wird dieses Netzwerk nicht für die automatische Verbindung berücksichtigt, auch wenn die App den entsprechenden Vorschlag für das Netzwerk entfernt und wieder hinzufügt. Wenn der Nutzer die WLAN-Auswahl verwendet, um explizit eine Verbindung zu einem Netzwerk herzustellen, das zuvor getrennt wurde, wird dieses Netzwerk sofort für die automatische Verbindung berücksichtigt.
Freigabestatus für App ändern
Wenn ein Nutzer die Benachrichtigung mit dem Vorschlag für ein Netzwerk ablehnt, wird die Berechtigung CHANGE_WIFI_STATE
für die App entfernt. Der Nutzer kann diese Genehmigung später erteilen, indem er das WLAN-Steuerungsmenü aufruft (Einstellungen > Apps & Benachrichtigungen > Spezieller App-Zugriff > WLAN-Steuerung > App name).