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:
- Interfejs Suggestions API obsługuje udostępnianie
PasspointConfiguration
. W starszych wersjach Androida udostępnianiePasspointConfiguration
wymagało użycia interfejsu APIaddOrUpdatePasspointConfiguration()
. - Platforma wymusza wymagania dotyczące bezpieczeństwa w sugestiach Enterprise opartych na TLS (EAP-TLS, EAP-TTLS i EAP-PEAP). Sugestie dotyczące takich sieci muszą mieć wartości
Root CA certificate
iserver domain name
.
- 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).