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, dzięki którym urządzenie automatycznie łączy się z punktem dostępu Wi-Fi. Możesz podać sugestie, z którą siecią chcesz się połączyć za pomocą narzędzia WifiNetworkSuggestion. Ostatecznie platforma określa, który punkt dostępu zaakceptuje, na podstawie danych wejściowych z Twojej aplikacji i innych użytkowników.

Na urządzeniu z Androidem 11 (poziom interfejsu API 30) i nowszym:

  • 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 aplikacjach podpisanych przez operatora.
  • W przypadku sugestii dostarczanych przez aplikacje podpisane przez operatora platforma automatycznie przypisuje im identyfikator operatora odpowiadający podpisywaniu przez operatora aplikacji. Takie sugestie są automatycznie wyłączone, jeśli wyjmiesz z urządzenia odpowiednią kartę SIM.

Na urządzeniu z Androidem 12 (poziom interfejsu API 31) i nowszym:

  • Dodatkową ochronę prywatności można włączyć za pomocą nietrwałej randomizacji MAC, która okresowo dokonuje losowej analizy losowego adresu MAC. Użyj parametru setMacRandomizationSetting, aby określić poziom randomizacji w sieci.

  • isPasspointTermsAndConditionsSupported(): Warunki korzystania z usługi to funkcja punktu dostępu, która umożliwia wdrożeniam sieciowym zastąpienie niezabezpieczonych portali przechwytujących, które korzystają z sieci otwartych, bezpieczną siecią Passpoint. Gdy wymagane jest zaakceptowanie warunków korzystania z usługi, użytkownikowi wyświetla się powiadomienie. Aplikacje sugerujące sieci Passpoint, które są objęte warunkami 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 mogło połączyć się z tą siecią. W takiej sytuacji trzeba też zaproponować sieć alternatywną lub starszą.

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

    Android 12 wdraża tę funkcję, aby zapewnić zgodność ze specyfikacją WBA rozszerzeń PPS-MO. Aplikacje sugerujące sieci Passpoint, które wymagają ozdobnej 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 można było utworzyć sugestię Passpoint, aplikacje muszą używać klas PasspointConfiguration, Credential i HomeSp. Te klasy opisują profil Passpoint zdefiniowany w specyfikacji Wi-Fi Alliance Passpoint.

Poniższy przykładowy kod pokazuje, jak podać dane logowania dla jednej sieci otwartej, 1 WPA2, 1 sieci WPA3 i 1 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 prześle sugestię, użytkownik otrzyma powiadomienie. Typ powiadomienia zależy od wersji Androida na urządzeniu:

  • Na Androidzie 11 (poziom interfejsu API 30) i nowszych użytkownik widzi okno dialogowe, jeśli aplikacja działa na pierwszym planie, oraz powiadomienie, jeśli 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 połączy się z jedną z sugestii dotyczących sieci, w ustawieniach wyświetli się tekst, który przypisuje połączenie sieciowe do odpowiedniej aplikacji proponującej.

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

Jeśli przy użyciu selektora Wi-Fi użytkownik jednoznacznie odłączy się od jednej z sugestii dotyczących sieci po połączeniu z nią, zostanie ona zignorowana, gdy nadal będzie w zasięgu. Przez ten czas sieć nie będzie brana pod uwagę jako połączenie automatyczne, nawet jeśli aplikacja usunie i ponownie doda powiązaną z nią sugestię sieci. Jeśli użytkownik skorzysta z selektora Wi-Fi, aby połączyć się z siecią, która została wcześniej odłączona, sieć zostanie natychmiast potraktowana jako połączenie automatyczne.

Zmiana stanu zatwierdzenia aplikacji

Jeśli użytkownik odrzuci powiadomienie z sugestią sieci, uprawnienia CHANGE_WIFI_STATE zostaną usunięte z aplikacji. Użytkownik może go później zatwierdzić, otwierając menu sterowania Wi-Fi (Ustawienia > Aplikacje i powiadomienia > Aplikacje ze specjalnym dostępem > Kontrola Wi-Fi > App name).