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

Na urządzeniach z Androidem 10 (poziom interfejsu API 29) lub nowszym aplikacja może dodawać sieci dane logowania, aby urządzenie automatycznie łączyło się z punktem dostępu Wi-Fi. Możesz podać sugestie dotyczące sieci, z którą należy się połączyć WifiNetworkSuggestion Ostatecznie platforma wybiera, które punkty dostępu zaakceptować, na podstawie danych z Twojej aplikacji i innych aplikacji.

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

  • Platforma egzekwuje wymagania dotyczące własności w przypadku Enterprise opartych na protokole EAP-SIM sugestie (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); takie sugestie są dozwolone tylko w aplikacjach 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, gdy karta SIM zostanie wyjęta z urządzenia.

Na Androidzie 12 (poziom API 31) i nowszych:

  • Dodatkową prywatność można włączyć za pomocą nietrwałej randomizacji MAC, który okresowo ponownie wybiera losowy adres MAC. Użyj formatu setMacRandomizationSetting aby określić poziom randomizacji w sieci.

  • isPasspointTermsAndConditionsSupported(): Warunki korzystania z usługi to Passpoint funkcja pozwalająca wdrożeniam sieciowym zastępować niezabezpieczone portale przechwytujące, które korzystają z sieci otwartych i bezpiecznej sieci Passpoint. Powiadomienie to wyświetlane użytkownikowi, gdy trzeba zaakceptować warunki korzystania z usługi. 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 dekoracją prefiksu prefiks tożsamości umożliwia operatorom sieci aktualizowanie dostępu do sieci Identyfikator (NAI) do jednoznacznego routingu przez wiele serwerów proxy w środku sieci AAA (patrz RFC 7542 dla więcej na ten temat).

    Android 12 wdraża tę funkcję, aby zapewnić zgodność ze specyfikacją WBA dla 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 dekorowana może też nie udać się uwierzytelnianie w sieci.

Aby tworzyć sugestie dotyczące Passpoint, aplikacje muszą używać klas PasspointConfiguration, CredentialHomeSp. Te klas opisują profil Passpoint, który jest zdefiniowany w Wi-Fi Alliance Protokół Passpoint specyfikacji.

Poniższy przykładowy kod pokazuje, jak podać dane logowania do jednego otwartego, WPA2, 1 sieć WPA3 i 1 sieć Passpoint:

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

Bezpośrednio po tym, jak aplikacja po raz pierwszy opublikuje sugestię, użytkownik powiadomienia. Typ powiadomień zależy od używanej wersji Androida na urządzeniu:

  • Na Androidzie 11 (poziom interfejsu API 30) i nowszych, użytkownik widzi okno, jeśli aplikacja jest działające na pierwszym planie, oraz powiadomienie, jeśli aplikacja działa w 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 dotyczących sieci, ustawienia będą widoczne , który przypisuje połączenie sieciowe do odpowiedniej aplikacji proponującej.

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

Jeśli użytkownik skorzysta z selektora Wi-Fi, aby jednoznacznie rozłączyć się z jednym z tych sieci sugestie dotyczące sieci po połączeniu z nią, wówczas sieć będzie ignorowana, wciąż mieści się w zakresie. W tym czasie sieć nie będzie brana pod uwagę w przypadku automatycznego łączenia, nawet jeśli aplikacja usunie i ponownie doda sugestię sieci. odpowiadające jej sieci. Jeśli użytkownik użyje selektora sieci Wi-Fi, aby połączyć się z siecią, z której wcześniej został odłączony, 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).