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

Urządzenia z Androidem 10 (poziom interfejsu API 29) lub 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ą WifiNetworkSuggestion. Platforma ostatecznie wybiera, które punkty dostępu zaakceptować, na podstawie danych wejściowych z Twojej aplikacji i innych aplikacji.

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

  • System egzekwuje wymagania dotyczące własności w przypadku sugestii dla firm na podstawie EAP-SIM (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); takie sugestie są dozwolone tylko w przypadku aplikacji podpisanych przez operatora.
  • W przypadku sugestii udostępnianych przez aplikację podpisaną przez operatora framework automatycznie przypisuje im identyfikator operatora odpowiadający podpisywaniu przez operatora aplikacji. Takie sugestie są automatycznie wyłączane, jeśli karta SIM zostanie wyjęta z urządzenia.

Na Androidzie 12 (poziom API 31) i nowszych:

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

  • isPasspointTermsAndConditionsSupported(): Warunki to funkcja Passpoint, która umożliwia zastąpienie niepewnych portali przechwytujących, korzystających z otwartych sieci, bezpieczną siecią Passpoint. Gdy użytkownik musi zaakceptować warunki, wyświetla się powiadomienie. Aplikacje, które sugerują sieci Passpoint, które są ograniczone przez warunki korzystania z usługi, 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 można połączyć się z taką siecią. W takiej sytuacji należy zaproponować alternatywną sieć lub sieć starszego typu.

  • isDecoratedIdentitySupported(): podczas uwierzytelniania w sieciach z ozdobą prefiksu operatorzy sieci mogą aktualizować identyfikator dostępu do sieci (NAI), aby przeprowadzić jawne kierowanie przez wiele serwerów proxy w ramach sieci AAA (więcej informacji znajdziesz w RFC 7542).

    Android 12 wdraża tę funkcję zgodnie ze specyfikacją WBA dotyczącą rozszerzeń PPS-MO. Aplikacje, które sugerują sieci Passpoint wymagające oznakowanej 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 udać.

Aby tworzyć sugestie dotyczące 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ć poświadczenia jednej sieci otwartej, 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);

Po pierwszym umieszczeniu przez aplikację sugestii użytkownik o tym dostaje powiadomienie. Typ powiadomienia zależy od wersji Androida zainstalowanej na urządzeniu:

  • W Androidzie 11 (poziom interfejsu API 30) i nowszych użytkownik zobaczy okno dialogowe, jeśli aplikacja działa na pierwszym planie, oraz powiadomienie, jeśli działa w tle.
  • W 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 sugestii sieci, w ustawieniach pojawi się tekst przypisujący połączenie z siecią do odpowiedniej aplikacji sugerującej.

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

Jeśli użytkownik użyje selektora Wi-Fi, aby odłączyć się od jednej z sugestii sieci, sieć ta jest ignorowana, dopóki znajduje się w zasięgu. W tym czasie sieć nie będzie brana pod uwagę w przypadku automatycznego połączenia, nawet jeśli aplikacja usunie i ponownie doda sugestię sieci odpowiadającą tej sieci. Jeśli użytkownik użyje selektora Wi-Fi, aby połączyć się z siecią, z której wcześniej się rozłączył, sieć ta zostanie natychmiast uwzględniona w automatycznym łączeniu.

Zmiana stanu zatwierdzenia aplikacji

Odrzucenie powiadomienia o sugestii sieci powoduje usunięcie uprawnienia CHANGE_WIFI_STATE z aplikacji. Użytkownik może przyznać to uprawnienie później, otwierając menu sterowania Wi-Fi (Ustawienia > Aplikacje i powiadomienia > Specjalny dostęp do aplikacji > Sterowanie Wi-Fi > App name).