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

Urządzenia z Androidem 10 (API na poziomie 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 punkt dostępu, który zostanie zaakceptowany, na podstawie danych wejściowych z Twojej aplikacji i innych aplikacji.

Na Androidzie 11 (poziom API 30) i nowszych:

  • Interfejs API sugestii obsługuje udostępnianie PasspointConfiguration. Przed Androidem 11 udostępnianie urządzenia PasspointConfiguration wymagało użycia interfejsu API addOrUpdatePasspointConfiguration().
  • Platforma wymusza wymagania dotyczące zabezpieczeń w przypadku sugestii dotyczących sieci Enterprise opartych na protokole TLS (EAP-TLS, EAP-TTLS i EAP-PEAP). Sugestie dotyczące takich sieci muszą ustawiać Root CA certificate i server domain name.
  • Platforma wymusza 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 podpisowi operatora aplikacji. Takie sugestie są automatycznie wyłączane, jeśli odpowiednia karta SIM zostanie usunięta z urządzenia.

Na Androidzie 12 (poziom API 31) i nowszych:

  • Dodatkową prywatność można zapewnić, włączając nietrwałą randomizację adresów MAC, która okresowo zmienia losowo wygenerowany adres MAC. Użyj setMacRandomizationSetting, aby określić poziom losowości w sieci.

  • isPasspointTermsAndConditionsSupported(): Warunki korzystania z usługi to funkcja Passpoint, która umożliwia 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, które sugerują sieci Passpoint ograniczone 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ą i należy zaproponować sieć alternatywną lub starszego typu.

  • isDecoratedIdentitySupported(): podczas uwierzytelniania w sieciach z prefiksem dekoracji prefiks dekoracji 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 znajdziesz w dokumencie RFC 7542).

    Android 12 implementuje tę funkcję, aby zapewnić zgodność 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 udekorowana, a uwierzytelnianie w sieci może się nie powieść.

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

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

Użytkownik zostanie powiadomiony natychmiast po tym, jak aplikacja po raz pierwszy umieści sugestię. Typ powiadomienia zależy od wersji Androida zainstalowanej na urządzeniu:

  • Na Androidzie 11 (poziom interfejsu API 30) lub nowszym użytkownik zobaczy okno, jeśli aplikacja działa na pierwszym planie, lub 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 sugerowanych sieci, w ustawieniach pojawi się tekst przypisujący 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 rozłączyć się z jedną z sugerowanych sieci, gdy jest z nią połączony, ta sieć będzie ignorowana, gdy nadal będzie w zasięgu. W tym okresie sieć nie będzie brana pod uwagę przy automatycznym łączeniu, nawet jeśli aplikacja usunie i ponownie doda sugestię dotyczącą tej sieci. Jeśli użytkownik użyje selektora Wi-Fi, aby połączyć się z siecią, która została wcześniej odłączona, ta sieć zostanie natychmiast uwzględniona w automatycznym łączeniu.

Zmieniam stan zatwierdzenia aplikacji

Jeśli użytkownik odrzuci powiadomienie o sugerowanej sieci, aplikacja utraci uprawnienie CHANGE_WIFI_STATE. Użytkownik może później przyznać to uprawnienie w menu sterowania Wi-Fi (Ustawienia > Aplikacje i powiadomienia > Aplikacje ze specjalnym dostępem > Sterowanie Wi-Fi > App name).