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 automatycznie łączyło się z punktem dostępu Wi-Fi. Możesz podać sugestię, z którą siecią należy się połączyć, korzystając z WifiNetworkSuggestion. Ostatecznie platforma wybiera punkt dostępu, który zaakceptuje na podstawie danych wejściowych z Twojej aplikacji i innych źródeł.

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

  • Obsługa administracyjna PasspointConfiguration jest obsługiwana przez interfejs API sugestii. W przypadku Androida 11 udostępnianie PasspointConfiguration wymagało korzystania z interfejsu API addOrUpdatePasspointConfiguration().
  • Ta platforma egzekwuje wymagania dotyczące bezpieczeństwa w przypadku sugestii dla przedsiębiorstw opartych na protokole TLS (EAP-TLS, EAP-TTLS i EAP-PEAP). Sugestie dla takich sieci muszą skonfigurować Root CA certificate i server domain name.
  • Ta platforma egzekwuje wymagania dotyczące własności w przypadku sugestii Enterprise opartych na 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 podpisywaniu aplikacji przez operatora. Sugestie te są automatycznie wyłączane po wyjęciu z urządzenia odpowiedniej karty SIM.

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

  • Dodatkową ochronę prywatności można włączyć przez nietrwałą randomizację adresów MAC, która okresowo powtarza losowy adres MAC. Aby określić poziom randomizacji w swojej sieci, użyj funkcji setMacRandomizationSetting.

  • isPasspointTermsAndConditionsSupported(): Warunki korzystania z usługi to funkcja Passpoint, która umożliwia wdrożeniam sieci zastąpienie niezabezpieczonych portali przechwytujących, które używają otwartych sieci, bezpiecznymi sieciami Passpoint. Jeśli warunki korzystania z usługi muszą zostać zaakceptowane, użytkownik zobaczy powiadomienie. Aplikacje, które sugerują sieci Passpoint objęte warunkami korzystania z usługi, muszą najpierw wywołać ten interfejs API, aby sprawdzić, czy urządzenie obsługuje tę funkcję. Jeśli urządzenie nie obsługuje tej funkcji, nie będzie w stanie połączyć się z tą siecią i pojawi się sugerowana sieć zastępcza lub starsza wersja.

  • isDecoratedIdentitySupported(): podczas uwierzytelniania w sieciach z ozdobnym prefiksem prefiks tożsamości umożliwia operatorom sieci aktualizowanie identyfikatora dostępu do sieci (NAI) w celu wykonywania jawnego routingu przez wiele serwerów proxy w sieci AAA (więcej informacji na ten temat znajdziesz w RFC 7542).

    Android 12 implementuje tę funkcję zgodnie ze specyfikacją rozszerzeń WBA dla rozszerzeń PPS-MO. Aplikacje, które sugerują sieci Passpoint, które wymagają zidentyfikowanej 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 dekorowana, a uwierzytelnianie w sieci może się nie udać.

Aby można było utworzyć sugestię Passpoint, aplikacje muszą korzystać z klas PasspointConfiguration, Credential i HomeSp. Te klasy opisują profil Passpoint określony w specyfikacji Wi-Fi Alliance Passpoint.

Poniższy przykładowy kod pokazuje, jak podać dane logowania do jednej sieci WPA2, WPA3 i 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);

Zaraz po tym, jak aplikacja po raz pierwszy prześle sugestię, użytkownik dostanie powiadomienie. Typ powiadomienia zależy od wersji Androida zainstalowanej na urządzeniu:

  • Na Androidzie 11 (poziom interfejsu API 30) i nowszych użytkownik widzi okno z informacją, że aplikacja działa na pierwszym planie, oraz powiadomienie o tym, że aplikacja 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 łączy się z jedną z sugestii sieci, w ustawieniach wyświetla się tekst przypisujący połączenie sieciowe odpowiedniej aplikacji polecającej.

Obsługa rozłączenia użytkowników

Jeśli użytkownik użyje selektora Wi-Fi, aby wyraźnie odłączyć się od jednej z sugerowanych sieci podczas nawiązywania połączenia, ta sieć będzie ignorowana, gdy znajdzie się w zasięgu. W tym czasie ta sieć nie będzie brać pod uwagę połączenia automatycznego, nawet jeśli aplikacja usunie i ponownie doda odpowiadającą jej sugerowaną sieć. Jeśli użytkownik korzysta z selektora sieci Wi-Fi, aby połączyć się z siecią, która została wcześniej odłączona, sieć zostanie natychmiast uznana za połączenie automatyczne.

Zmiana stanu zatwierdzenia aplikacji

Użytkownik, który odrzuci powiadomienie sugestii sieci, usunie z aplikacji uprawnienie CHANGE_WIFI_STATE. Użytkownik może je później przyznać, otwierając menu sterowania Wi-Fi (Ustawienia > Aplikacje i powiadomienia > Specjalny dostęp do aplikacji > Sterowanie Wi-Fi > App name).