Urządzenia z Androidem 10 (poziom interfejsu API 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, które punkty dostępu zaakceptować, na podstawie danych wejściowych z Twojej aplikacji i innych aplikacji.
W Androidzie 11 (poziom 30 interfejsu API) i nowszych:
- Interfejs Suggestions API obsługuje udostępnianie
PasspointConfiguration
. Przed Androidem 11, tworzeniePasspointConfiguration
wymaga użycia interfejsu APIaddOrUpdatePasspointConfiguration()
. - Ramy te narzucają wymagania dotyczące bezpieczeństwa w przypadku sugestii opartych na protokole TLS (EAP-TLS, EAP-TTLS i EAP-PEAP) w firmach. Sugerowane sieci muszą mieć ustawione
Root CA certificate
iserver domain name
.
- System egzekwuje wymagania dotyczące własności w przypadku sugestii dla firm na podstawie EAP-SIM (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); takie sugestie są dozwolone tylko w przypadku aplikacji 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, jeśli karta SIM zostanie wyjęta z urządzenia.
Na Androidzie 12 (poziom API 31) i nowszych:
Dodatkową ochronę prywatności można włączyć za pomocą nietrwałej randomizacji adresu MAC, która okresowo ponownie losuje losowy adres MAC. Użyj atrybutu
setMacRandomizationSetting
, aby określić poziom losowości w swojej sieci.isPasspointTermsAndConditionsSupported()
: Warunki to funkcja Passpoint, która umożliwia zastąpienie niepewnych portali przechwytujących, korzystających z otwartych sieci, bezpieczną siecią Passpoint. Gdy użytkownik musi zaakceptować warunki, wyświetla się powiadomienie. 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 się połączyć z tą siecią. W takim przypadku należy zaproponować sieć alternatywną lub starszą.isDecoratedIdentitySupported()
: podczas uwierzytelniania w sieciach z ozdobą prefiksu operatorzy sieci mogą aktualizować identyfikator dostępu do sieci (NAI), aby przeprowadzić jawne kierowanie przez wiele serwerów proxy w ramach sieci AAA (więcej informacji znajdziesz w RFC 7542).Android 12 wdraża tę funkcję zgodnie ze specyfikacją WBA dotyczącą 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 udać.
Aby tworzyć sugestie dotyczące Passpoint, aplikacje muszą używać klas PasspointConfiguration
, Credential
i HomeSp
. Te klasy opisują profil Passpoint, który jest zdefiniowany w specyfikacji Passpoint organizacji Wi-Fi Alliance.
Poniższy przykładowy kod pokazuje, jak podać poświadczenia dla 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);
Po pierwszym umieszczeniu sugestii przez aplikację użytkownik otrzymuje powiadomienie. Typ powiadomienia zależy od wersji Androida zainstalowanej 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.
- 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, w ustawieniach wyświetli się tekst, który przypisuje połączenie sieciowe do odpowiedniej aplikacji proponującej.
Obsługa rozłączeń użytkowników
Jeśli użytkownik użyje selektora Wi-Fi, aby odłączyć się od jednej z sugestii sieci, sieć ta jest ignorowana, dopóki znajduje się 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 użyje selektora Wi-Fi, aby połączyć się z siecią, z której wcześniej się rozłączył, 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).