Interfejs Wi-Fi Offer API do łączenia się z internetem

Urządzenia z Androidem 10 (API na poziomie 29) i nowszym umożliwiają aplikacji dodawanie danych logowania do sieci, aby urządzenie mogło automatycznie łączyć się z punktem dostępu Wi-Fi. Możesz podać sugestie dotyczące sieci, z którą chcesz się połączyć, za pomocą elementu WifiNetworkSuggestion. Platforma ostatecznie wybiera punkt dostępu na podstawie danych wejściowych z Twojej aplikacji i innych aplikacji.

Na Androidzie 11 (poziom 30 interfejsu API) i nowszych:

  • Udostępnianie PasspointConfiguration jest obsługiwane przez interfejs Suggestion API. W przypadku Androida 11 i starszych wersji udostępnianie PasspointConfiguration wymaga użycia interfejsu addOrUpdatePasspointConfiguration().
  • Platforma wymusza wymagania dotyczące bezpieczeństwa w przypadku sugestii dotyczących sieci firmowych opartych na protokole TLS (EAP-TLS, EAP-TTLS i EAP-PEAP). Sugestie dotyczące takich sieci muszą zawierać Root CA certificateserver domain name.
  • Framework wymusza wymagania dotyczące własności w przypadku sugestii dotyczących sieci firmowych opartych na protokole EAP-SIM (EAP-SIM, EAP-AKA, EAP-AKA-PRIME). Takie sugestie są dozwolone tylko w przypadku aplikacji podpisanych przez operatora.
  • W przypadku sugestii dostarczanych przez aplikację podpisaną przez operatora platforma automatycznie przypisuje im identyfikator operatora odpowiadający podpisowi operatora aplikacji. Takie sugestie są automatycznie wyłączane, jeśli odpowiednia karta SIM zostanie usunięta z urządzenia.

Na Androidzie 12 (poziom 31 interfejsu API) i nowszych:

  • Dodatkową ochronę prywatności można włączyć za pomocą nietrwałej randomizacji adresu MAC, która okresowo ponownie randomizuje losowy adres MAC. Użyj tagu setMacRandomizationSetting, aby określić poziom randomizacji w swojej sieci.

  • isPasspointTermsAndConditionsSupported():Warunki to funkcja Passpoint, która umożliwia zastąpienie niezabezpieczonych portali przechwytujących, które korzystają z otwartych sieci, bezpieczną siecią Passpoint. Gdy wymagane jest zaakceptowanie warunków, użytkownikowi wyświetla się powiadomienie. Aplikacje, które sugerują sieci Passpoint z warunkami, muszą najpierw wywołać ten interfejs API, aby upewnić się, że urządzenie obsługuje tę funkcję. Jeśli urządzenie nie obsługuje tej funkcji, nie będzie mogło połączyć się z tą siecią. W takim przypadku należy zaproponować sieć alternatywną lub starszą.

  • isDecoratedIdentitySupported(): podczas uwierzytelniania w sieciach z dekoracją prefiksu udekorowany prefiks tożsamości umożliwia operatorom sieci aktualizowanie identyfikatora NAI w celu wykonywania jawnego routingu przez wiele serwerów proxy w sieci AAA (więcej informacji znajdziesz w RFC 7542).

    Android 12 implementuje tę funkcję zgodnie ze specyfikacją WBA dotyczącą rozszerzeń PPS-MO. Aplikacje, które sugerują sieci Passpoint wymagające udekorowanej tożsamości, muszą najpierw wywołać ten interfejs API, aby upewnić się, że urządzenie obsługuje tę funkcję. Jeśli urządzenie nie obsługuje tej funkcji, tożsamość nie zostanie ozdobiona, a uwierzytelnianie w sieci może się nie powieść.

Aby utworzyć sugestię Passpoint, aplikacje muszą używać klas PasspointConfiguration, CredentialHomeSp. Te klasy opisują profil Passpoint, który jest zdefiniowany w specyfikacji Passpoint organizacji Wi-Fi Alliance.

Poniższy przykładowy kod pokazuje, jak podać dane logowania do jednej otwartej sieci, jednej sieci WPA2, jednej sieci WPA3 i jednej sieci Passpoint:

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

Natychmiast po tym, jak aplikacja po raz pierwszy umieści sugestię, użytkownik otrzyma powiadomienie. Rodzaj powiadomienia zależy od wersji Androida, która jest zainstalowana na urządzeniu:

  • Na Androidzie 11 (poziom interfejsu API 30) i nowszym użytkownik zobaczy okno dialogowe, jeśli aplikacja działa na pierwszym planie, a powiadomienie, jeśli działa w tle.
  • Na Androidzie 10 (poziom interfejsu API 29) użytkownik widzi powiadomienie niezależnie od tego, czy aplikacja działa na pierwszym planie, czy w tle.

Gdy platforma połączy się z jedną z sugerowanych sieci, w ustawieniach pojawi się tekst, który przypisuje połączenie sieciowe do odpowiedniej aplikacji sugerującej.

Obsługa rozłączeń użytkowników

Jeśli użytkownik użyje selektora Wi-Fi, aby wyraźnie odłączyć się od jednej z sugerowanych sieci, gdy jest z nią połączony, ta sieć będzie ignorowana, gdy będzie w zasięgu. W tym czasie sieć nie będzie brana pod uwagę przy automatycznym łączeniu, nawet jeśli aplikacja usunie i ponownie doda sugestię sieci odpowiadającą tej sieci. Jeśli użytkownik użyje selektora Wi-Fi, aby wyraźnie połączyć się z siecią, która została wcześniej odłączona, sieć ta będzie od razu brana pod uwagę przy automatycznym łączeniu.

Zmiana stanu zatwierdzenia aplikacji

Jeśli użytkownik odrzuci powiadomienie z propozycją sieci, aplikacja utraci uprawnienieCHANGE_WIFI_STATE. Użytkownik może później przyznać to uprawnienie, otwierając menu sterowania Wi-Fi (Ustawienia > Aplikacje i powiadomienia > Specjalny dostęp do aplikacji > Sterowanie Wi-Fi > App name).