Android 10 (API düzeyi 29) ve sonraki sürümlerin yüklü olduğu cihazlar, uygulamanızın bir cihaz için ağ kimlik bilgileri eklemesine olanak tanır. Böylece cihaz, kablosuz erişim noktasına otomatik olarak bağlanabilir. WifiNetworkSuggestion
kullanarak hangi ağa bağlanılacağına dair önerilerde bulunabilirsiniz.
Platform, uygulamanızdan ve diğer uygulamalardan gelen girişe göre hangi erişim noktasının kabul edileceğine karar verir.
Android 11 (API düzeyi 30) ve sonraki sürümlerde:
PasspointConfiguration
sağlama, öneri API'si tarafından desteklenir. Android 11'den önceki sürümlerdePasspointConfiguration
sağlamak içinaddOrUpdatePasspointConfiguration()
API'sinin kullanılması gerekir.- Çerçeve, TLS tabanlı kurumsal önerilerde (EAP-TLS, EAP-TTLS ve EAP-PEAP) güvenlik şartlarını zorunlu kılar. Bu tür ağlara yönelik önerilerde
Root CA certificate
veserver domain name
ayarlanmalıdır.
- Bu çerçeve, EAP-SIM tabanlı kurumsal öneriler (EAP-SIM, EAP-AKA, EAP-AKA-PRIME) için sahiplik şartlarını zorunlu kılar. Bu tür önerilere yalnızca operatör imzalı uygulamalar tarafından izin verilir.
- Operatör imzalı bir uygulama tarafından sağlanan önerilere, çerçeve otomatik olarak uygulamanın operatör imzasına karşılık gelen bir operatör kimliği atar. Bu tür öneriler, ilgili SIM cihazdan çıkarılırsa otomatik olarak devre dışı bırakılır.
Android 12 (API düzeyi 31) ve sonraki sürümlerde:
Rastgele hale getirilmiş MAC adresini belirli aralıklarla yeniden rastgele hale getiren geçici olmayan MAC rastgele hale getirme özelliğiyle ek gizlilik sağlanabilir. Ağınızın rastgeleleştirme düzeyini belirtmek için
setMacRandomizationSetting
kullanın.isPasspointTermsAndConditionsSupported()
: Hükümler ve koşullar, ağ dağıtımlarının açık ağları kullanan güvenli olmayan giriş portallarını güvenli bir Passpoint ağıyla değiştirmesine olanak tanıyan bir Passpoint özelliğidir. Hüküm ve koşulların kabul edilmesi gerektiğinde kullanıcıya bir bildirim gösterilir. Şartlar ve koşullarla sınırlanan Passpoint ağları öneren uygulamalar, cihazın bu özelliği desteklediğinden emin olmak için önce bu API'yi çağırmalıdır. Cihaz bu özelliği desteklemiyorsa bu ağa bağlanamaz ve alternatif veya eski bir ağ önerilmelidir.isDecoratedIdentitySupported()
: Önek süslemeli ağlarda kimlik doğrulama yapılırken süslenmiş kimlik öneki, ağ operatörlerinin AAA ağı içindeki birden fazla proxy üzerinden açık yönlendirme yapmak için Ağ Erişim Tanımlayıcısı'nı (NAI) güncellemesine olanak tanır (bu konuda daha fazla bilgi için RFC 7542'ye bakın).Android 12, PPS-MO uzantıları için WBA spesifikasyonuna uygun olması amacıyla bu özelliği uygular. Dekore edilmiş kimlik gerektiren Passpoint ağları öneren uygulamalar, cihazın bu özelliği desteklediğinden emin olmak için önce bu API'yi çağırmalıdır. Cihaz bu özelliği desteklemiyorsa kimlik süslenmez ve ağda kimlik doğrulama işlemi başarısız olabilir.
Uygulamaların Passpoint önerisi oluşturmak için PasspointConfiguration
, Credential
ve HomeSp
sınıflarını kullanması gerekir. Bu sınıflar, Wi-Fi Alliance Passpoint spesifikasyonunda tanımlanan Passpoint profilini açıklar.
Aşağıdaki kod örneğinde, bir açık, bir WPA2, bir WPA3 ve bir Passpoint ağı için kimlik bilgilerinin nasıl sağlanacağı gösterilmektedir:
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);
Uygulama ilk kez öneri yerleştirdikten hemen sonra kullanıcıya bildirim gönderilir. Bildirim türü, cihazda çalışan Android sürümüne bağlıdır:
- Android 11 (API düzeyi 30) ve sonraki sürümlerde uygulama ön planda çalışıyorsa kullanıcı bir iletişim kutusu, arka planda çalışıyorsa bildirim görür.
- Android 10'da (API düzeyi 29) uygulama ön planda veya arka planda çalışıyor olsa da kullanıcı bir bildirim görür.
Platform, ağ önerilerinden birine bağlandığında ayarlarda, ağ bağlantısını ilgili öneren uygulamaya atfeden bir metin gösterilir.
Kullanıcı bağlantısının kesilmesini işleme
Kullanıcı, kablosuz ağ seçiciyi kullanarak bağlı olduğu ağ önerilerinden birinin bağlantısını açıkça keserse bu ağ, kapsama alanında olduğu sürece yok sayılır. Bu süre zarfında, uygulama ağ önerisini kaldırıp yeniden eklese bile söz konusu ağ otomatik bağlantı için dikkate alınmaz. Kullanıcı, daha önce bağlantısı kesilmiş bir ağa açıkça bağlanmak için kablosuz ağ seçiciyi kullanırsa bu ağ hemen otomatik bağlantı için değerlendirilir.
Uygulamanın onay durumunu değiştirme
Ağ önerisi bildirimini reddeden kullanıcılar, uygulamadan CHANGE_WIFI_STATE
iznini kaldırır. Kullanıcılar, daha sonra Wi-Fi kontrol menüsüne (Ayarlar > Uygulamalar ve bildirimler > Özel uygulama erişimi > Wi-Fi kontrolü > App name) giderek bu onayı verebilir.