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 to platforma decyduje, który punkt dostępu zaakceptuje z aplikacji i innych źródeł.

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 karcie EAP-SIM sugestie (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); takie sugestie są dozwolone tylko w aplikacjach podpisanych przez operatora.
  • W przypadku sugestii dostarczanych przez aplikację podpisaną przez operatora platforma automatycznie przypisuje im identyfikator operatora odpowiadający podpisywanie przez operatora. Taka sugestie są automatycznie wyłączone po wyjęciu odpowiedniej karty SIM z urządzenia.

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

  • 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 sugerujące sieci Passpoint podlegające zasadom korzystania z usługi musi 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ę sieć oraz musisz zasugerować alternatywną lub starszą sieć.

  • 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 sugerujące sieci Passpoint, które wymagają ozdobionej tożsamości, muszą najpierw wywołaj 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 utworzyć sugestię Passpoint, aplikacje muszą używać protokołu PasspointConfiguration Credential i HomeSp zajęć. Te klasyfikują 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:

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

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.
  • Na Androidzie 10 (poziom interfejsu API 29) użytkownik widzi powiadomienie niezależnie od tego, 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żywa selektora Wi-Fi, jeśli połączysz się z siecią, która została wcześniej odłączona, jest brana pod uwagę na automatyczne połączenie.

Zmiana stanu zatwierdzenia aplikacji

Odrzucenie powiadomienia o sugestii dotyczącej sieci przez użytkownika powoduje usunięcie CHANGE_WIFI_STATE z aplikacji. Użytkownik może przyznać to zatwierdzenie później, otwierając menu sterowania Wi-Fi (Ustawienia > Aplikacje i powiadomienia > Aplikacja specjalna dostęp > Sterowanie Wi-Fi > App name).