İ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 ağ erişim noktasına otomatik olarak bağlanması için ağ kimlik bilgileri eklemesine olanak tanır. WifiNetworkSuggestion kullanarak hangi ağa bağlanılacağıyla ilgili önerilerde bulunabilirsiniz. Platform, uygulamanızdan ve diğer uygulamalardan gelen girişlere göre hangi erişim noktasının kabul edileceğini 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 şartlarını zorunlu kılar. Bu tür önerilere yalnızca operatör tarafından imzalanmış uygulamalar izin verir.
  • Operatör tarafından imzalanmış bir uygulama tarafından sağlanan öneriler için çerçeve, uygulamanın operatör imzasına karşılık gelen bir operatör kimliğini otomatik olarak atar. İlgili SIM cihazdan çıkarı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 MAC adresini düzenli olarak yeniden rastgele hale getiren kalıcı olmayan rastgele MAC adresi aracılığıyla ek gizlilik etkinleştirilebilir. 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ümler ve koşulların kabul edilmesi gerektiğinde kullanıcıya bir bildirim gösterilir. Hükümler ve Koşullar'a tabi Passpoint ağları öneren uygulamaların, cihazın bu özelliği desteklediğinden emin olmak için önce bu API'yi çağırması gerekir. Cihaz bu özelliği desteklemiyorsa bu ağa bağlanamaz ve alternatif veya eski bir ağ önerilmesi gerekir.

  • isDecoratedIdentitySupported(): Önek dekorasyonu olan ağlarda kimlik doğrulaması yapılırken dekore edilmiş kimlik öneki, ağ operatörlerinin Ağ Erişim Tanımlayıcısı'nı (NAI) güncelleyerek bir AAA ağındaki birden fazla proxy üzerinden açık yönlendirme yapmasına olanak tanır (bu konuda daha fazla bilgi için RFC 7542'ye bakın).

    Android 12, bu özelliği PPS-MO uzantıları için WBA spesifikasyonuna uygun olacak şekilde uygular. Süslenmiş 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 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 açıklar.

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

Platform, ağ önerilerinden birine bağlandığında ayarlarda ağ bağlantısını ilgili öneren uygulamayla ilişkilendiren bir metin gösterilir.

Kullanıcı bağlantısının kesilmesini yönetme

Kullanıcı, kablosuz ağ seçiciyi kullanarak ağ önerilerinden birinin bağlantısını açıkça keserse bu ağ, kapsama alanında olsa bile yok sayılır. Bu süre zarfında, uygulama ağa karşılık gelen 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 durumu değiştiriliyor

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