İnternet bağlantısı için Wi-Fi öneri API'sı

Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran cihazlar, uygulamanızın bir cihazın kablosuz erişim noktasına otomatik olarak bağlanması için ağ kimlik bilgileri eklemesine izin verir. WifiNetworkSuggestion kullanarak hangi ağa bağlanacağınıza dair öneriler sağlayabilirsiniz. Hangi erişim noktasının kabul edileceğini, uygulamanızdan ve diğer kaynaklardan gelen verilere göre platform seçer.

Android 11 (API düzeyi 30) ve sonraki sürümlerde:

  • Çerçeve, EAP-SIM tabanlı Kurumsal öneriler (EAP-SIM, EAP-AKA, EAP-AKA-PRIME) için sahiplik gereksinimlerini zorunlu kılar. Bu tür önerilere yalnızca operatör tarafından imzalanmış uygulamalar tarafından izin verilir.
  • Operatör tarafından imzalanmış bir uygulama tarafından sağlanan öneriler için çerçeve, bu önerilere otomatik olarak uygulamanın operatör imzasına karşılık gelen bir operatör kimliği atar. İlgili SIM cihazdan kaldırılırsa bu tür öneriler otomatik olarak devre dışı bırakılır.

Android 12 (API düzeyi 31) ve sonraki sürümlerde:

  • Rastgele hale getirilmiş MAC adresini düzenli aralıklarla yeniden rastgele hale getiren kalıcı olmayan MAC rastgele hale getirme aracılığıyla ek gizlilik etkinleştirilebilir. Ağınızın rastgele olma düzeyini belirtmek için setMacRandomizationSetting aracını 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ın yerini güvenli bir Passpoint ağıyla değiştirmesini sağlayan bir Passpoint özelliğidir. Şartlar ve koşulların kabul edilmesi gerektiğinde kullanıcıya bir bildirim gösterilir. Şartlar ve koşullarla korunan Passpoint ağlarını ö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üslemesiyle ağlara kimlik doğrularken, ağ operatörlerinin Ağ Erişim Tanımlayıcısını (NAI) bir AAA ağı içindeki birden çok proxy üzerinden açık yönlendirme gerçekleştirmek için güncellemesini sağlar (bu konuda daha fazla bilgi için RFC 7542'yi inceleyin).

    Android 12, bu özelliği PPS-MO uzantılarına ilişkin WBA spesifikasyonuna uymak için uygular. Süslü kimlik gerektiren Passpoint ağlarını ö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 işlenmez ve ağ için kimlik doğrulaması başarısız olabilir.

Passpoint önerisi oluşturmak için uygulamaların PasspointConfiguration, Credential ve HomeSp sınıflarını kullanması gerekir. Bu sınıflar, Wi-Fi Alliance Passpoint spesifikasyonunda tanımlanan Passpoint profilini tanımlar.

Aşağıdaki kod örneğinde bir açık, bir WPA2, bir WPA3 ağı 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 bir öneride bulunduktan hemen sonra kullanıcı bilgilendirilir. 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, uygulama arka planda çalışıyorsa bir bildirim görür.
  • Android 10'da (API düzeyi 29) kullanıcıya, uygulamanın ön veya arka planda çalışmasına bakılmaksızın bildirim gösterilir.

Platform, ağ önerilerinden birine bağlandığında ayarlarda ağ bağlantısını ilgili önerici uygulamasıyla ilişkilendiren metin gösterilir.

Kullanıcı bağlantı kaldırma işlemlerini işleme

Kullanıcı, bağlandığında ağ önerilerinden birinin bağlantısını açıkça kesmek için kablosuz ağ seçiciyi kullanırsa bu ağ, hâlâ kapsama alanındayken yoksayılır. Bu süre zarfında uygulama, ağa karşılık gelen ağ önerisini kaldırıp yeniden eklese bile bu 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 söz konusu ağ hemen otomatik bağlantı için değerlendirilir.

Uygulamanın onay durumunu değiştirme

Ağ önerisi bildirimini reddeden bir kullanıcı, CHANGE_WIFI_STATE iznini uygulamadan kaldırır. Kullanıcı daha sonra kablosuz ağ kontrol menüsüne (Ayarlar > Uygulamalar ve bildirimler > Özel Uygulama erişimi > Kablosuz Kontrolü > App name) giderek bu onayı verebilir.