Wi-Fi Suggest API für Internetverbindung

Auf Geräten mit Android 10 (API-Level 29) und höher kann Ihre App Netzwerkanmeldedaten für ein Gerät hinzufügen, damit es automatisch eine Verbindung zu einem WLAN-Zugangspunkt herstellen kann. Mit WifiNetworkSuggestion können Sie Vorschläge dazu machen, mit welchem Netzwerk eine Verbindung hergestellt werden soll. Die Plattform wählt letztendlich anhand der Eingaben Ihrer App und anderer Apps aus, welcher Zugangspunkt akzeptiert wird.

Unter Android 11 (API-Level 30) und höher:

  • Das Framework erzwingt Eigentumsanforderungen für EAP-SIM-basierte Enterprise-Versionen Vorschläge (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); sind solche Vorschläge nur von Apps zugelassen, die vom Mobilfunkanbieter signiert sind.
  • Vorschlägen, die von einer vom Mobilfunkanbieter signierten App stammen, wird vom Framework automatisch eine Mobilfunkanbieter-ID zugewiesen, die der Mobilfunkanbietersignatur der App entspricht. Ein solches Vorschläge werden automatisch deaktiviert, wenn die entsprechende SIM-Karte entfernt wird vom Gerät aus.

Unter Android 12 (API-Level 31) und höher:

  • Zusätzlicher Datenschutz kann über eine persistente MAC-Zufallsauswahl aktiviert werden. die die zufällige MAC-Adresse regelmäßig neu zufällig generiert. setMacRandomizationSetting verwenden um den Grad der Randomisierung für Ihr Netzwerk festzulegen.

  • isPasspointTermsAndConditionsSupported(): Nutzungsbedingungen ist eine Passpoint-Funktion, mit der bei Netzwerkbereitstellungen unsichere Captive Portals, die offene Netzwerke verwenden, durch ein sicheres Passpoint-Netzwerk ersetzt werden können. Eine Benachrichtigung ist die dem Nutzer angezeigt werden, wenn die Nutzungsbedingungen akzeptiert werden müssen. Apps, die Passpoint-Netzwerke vorschlagen, die durch Nutzungsbedingungen eingeschränkt sind, 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 keine Verbindung zu diesem Netzwerk hergestellt werden. Es muss dann ein alternatives oder älteres Netzwerk vorgeschlagen werden.

  • isDecoratedIdentitySupported(): Beim Authentifizieren in Netzwerken mit Präfixdekoration können Netzwerkbetreiber mit dem dekorierten Identitätspräfix den Network Access Identifier (NAI) aktualisieren, um ein explizites Routing über mehrere Proxys innerhalb eines AAA-Netzwerks durchzuführen. Weitere Informationen finden Sie unter RFC 7542.

    Diese Funktion wird in Android 12 implementiert, um der WBA-Spezifikation für PPS-MO . Apps, die Passpoint-Netzwerke vorschlagen, für die eine dekorierte Identität erforderlich ist, 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, wird die Identität nicht dekoriert 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.

Im folgenden Codebeispiel wird gezeigt, wie Anmeldedaten für ein offenes, ein WPA2-, ein WPA3- und ein Passpoint-Netzwerk angegeben werden:

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

Sobald die App zum ersten Mal einen Vorschlag macht, wird der Nutzer benachrichtigt. Der Benachrichtigungstyp hängt von der Android-Version ab auf dem Gerät:

  • 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 unabhängig davon eine Benachrichtigung angezeigt, 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 App zuweist.

Umgang mit Nutzerunterbrechungen

Wenn der Nutzer die WLAN-Auswahl verwendet, um die Verbindung zu einem der Netzwerkvorschläge erhalten, wenn eine Verbindung besteht, wird dieses Netzwerk ignoriert, wenn es ist noch im Bereich. Während dieses Zeitraums wird das Netzwerk nicht berücksichtigt für die automatische Verbindung, auch wenn die App den Netzwerkvorschlag entfernt und wieder hinzufügt die dem Netzwerk entsprechen. Wenn der Nutzer die WLAN-Auswahl verwendet, sich mit einem Netzwerk verbinden, das zuvor nicht verbunden war, wird dieses Netzwerk sofort für die automatische Verbindung in Betracht gezogen werden.

Freigabestatus für App ändern

Wenn ein Nutzer die Benachrichtigung zum Netzwerkvorschlag ablehnt, wird die Berechtigung CHANGE_WIFI_STATE von der App entfernt. Der Nutzer kann diese Genehmigung später erteilen, indem er das Menü „WLAN-Steuerung“ aufruft (Einstellungen > Apps und Benachrichtigungen > Spezieller App-Zugriff > WLAN-Steuerung > App name).