Kablosuz taramasına genel bakış

Cihazdan görünen kablosuz erişim noktalarının listesini almak için WifiManager API'nin sağladığı kablosuz tarama özelliklerini kullanabilirsiniz.

Kablosuz ağ tarama süreci

Tarama süreci üç aşamadan oluşur:

  1. Tarama istekleri tamamlandığında çağrılan ve başarı/başarısızlık durumunu sağlayan SCAN_RESULTS_AVAILABLE_ACTION için yayın işleyicisi kaydetme. Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran cihazlarda bu yayın, platform veya diğer uygulamalar tarafından cihazda gerçekleştirilen tüm Wi-Fi taramaları için gönderilir. Uygulamalar, kendi taramalarını yapmadan yayın kullanarak cihazdaki tüm tarama tamamlamalarını pasif olarak dinleyebilir.

  2. WifiManager.startScan() simgesini kullanarak tarama isteğinde bulunun. Arama, aşağıdaki nedenlerden herhangi biriyle başarısız olabileceğinden yöntemin dönüş durumunu kontrol ettiğinizden emin olun:

    • Kısa süre içinde çok fazla tarama yapıldığında tarama istekleri sınırlandırılabilir.
    • Cihaz boşta ve tarama devre dışı.
    • Kablosuz donanımı, tarama hatası bildiriyor.
  3. WifiManager.getScanResults() kullanarak tarama sonuçlarını alma. Döndürülen tarama sonuçları, en son güncellenen sonuçlardır. Mevcut taramanız tamamlanmadıysa veya başarılı olmadıysa bu sonuçlar önceki bir taramaya ait olabilir. Bu, başarılı bir SCAN_RESULTS_AVAILABLE_ACTION yayını almadan önce bu yöntemi çağırırsanız daha eski tarama sonuçları alabileceğiniz anlamına gelir.

Aşağıdaki kodda bu adımların nasıl uygulanacağına dair bir örnek verilmiştir:

Kotlin

val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager

val wifiScanReceiver = object : BroadcastReceiver() {

  override fun onReceive(context: Context, intent: Intent) {
    val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
    if (success) {
      scanSuccess()
    } else {
      scanFailure()
    }
  }
}

val intentFilter = IntentFilter()
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
context.registerReceiver(wifiScanReceiver, intentFilter)

val success = wifiManager.startScan()
if (!success) {
  // scan failure handling
  scanFailure()
}

....

private fun scanSuccess() {
  val results = wifiManager.scanResults
  ... use new scan results ...
}

private fun scanFailure() {
  // handle failure: new scan did NOT succeed
  // consider using old scan results: these are the OLD results!
  val results = wifiManager.scanResults
  ... potentially use older scan results ...
}

Java

WifiManager wifiManager = (WifiManager)
                   context.getSystemService(Context.WIFI_SERVICE);

BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context c, Intent intent) {
    boolean success = intent.getBooleanExtra(
                       WifiManager.EXTRA_RESULTS_UPDATED, false);
    if (success) {
      scanSuccess();
    } else {
      // scan failure handling
      scanFailure();
    }
  }
};

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
context.registerReceiver(wifiScanReceiver, intentFilter);

boolean success = wifiManager.startScan();
if (!success) {
  // scan failure handling
  scanFailure();
}

....

private void scanSuccess() {
  List<ScanResult> results = wifiManager.getScanResults();
  ... use new scan results ...
}

private void scanFailure() {
  // handle failure: new scan did NOT succeed
  // consider using old scan results: these are the OLD results!
  List<ScanResult> results = wifiManager.getScanResults();
  ... potentially use older scan results ...
}

Kısıtlamalar

Android 8.0 (API düzeyi 26), izinler ve izin verilen Wi-Fi tarama sıklığıyla ilgili kısıtlamalar getirmiştir.

Android 9 (API düzeyi 28), ağ performansını, güvenliği ve pil ömrünü iyileştirmek için izin şartlarını sıkılaştırdı ve kablosuz taramalarının sıklığını daha da sınırladı.

İzinler

Android 8.0 ve Android 8.1:

WifiManager.getScanResults() için başarılı bir çağrı yapmak üzere aşağıdaki izinlerden herhangi birine sahip olmanız gerekir:

Arama uygulamasında bu izinlerden herhangi biri yoksa arama SecurityException ile başarısız olur.

Alternatif olarak, Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazlarda, konum izni gerektirmeden uygulamanız adına yakındaki eşlikçi cihazları taramak için CompanionDeviceManager kullanabilirsiniz. Bu seçenek hakkında daha fazla bilgi için Yardımcı cihaz eşleme başlıklı makaleyi inceleyin.

Android 9:

WifiManager.startScan() için başarılı bir çağrı yapılabilmesi için aşağıdaki koşulların tümünün karşılanması gerekir:

Android 10 (API düzeyi 29) ve sonraki sürümler:

WifiManager.startScan() için başarılı bir çağrı yapılabilmesi için aşağıdaki koşulların tümünün karşılanması gerekir:

  • Uygulamanız Android 10 (API düzeyi 29) SDK'sını veya daha yeni bir SDK'yı hedefliyorsa uygulamanızda ACCESS_FINE_LOCATION izni vardır.
  • Uygulamanız Android 10'dan (API düzeyi 29) daha düşük bir SDK'yı hedefliyorsa uygulamanızda ACCESS_COARSE_LOCATION veya ACCESS_FINE_LOCATION izni vardır.
  • Uygulamanızda CHANGE_WIFI_STATE izni var.
  • Cihazda konum hizmetleri etkinleştirilmiş olmalıdır (Ayarlar > Konum bölümünde).

WifiManager.getScanResults()'ı başarıyla aramak için aşağıdaki koşulların tümünün karşılandığından emin olun:

  • Uygulamanız Android 10 (API düzeyi 29) SDK'sını veya daha yeni bir SDK'yı hedefliyorsa uygulamanızda ACCESS_FINE_LOCATION izni vardır.
  • Uygulamanız Android 10'dan (API düzeyi 29) daha düşük bir SDK'yı hedefliyorsa uygulamanızda ACCESS_COARSE_LOCATION veya ACCESS_FINE_LOCATION izni vardır.
  • Uygulamanızda ACCESS_WIFI_STATE izni var.
  • Cihazda konum hizmetleri etkinleştirilmiş olmalıdır (Ayarlar > Konum bölümünde).

Arama uygulaması bu koşulların tümünü karşılamıyorsa arama SecurityException ile başarısız olur.

Sınırlama

WifiManager.startScan() kullanılarak yapılan taramaların sıklığıyla ilgili aşağıdaki sınırlamalar geçerlidir.

Android 8.0 ve Android 8.1:

Her arka plan uygulaması 30 dakikalık süre içinde bir kez tarama yapabilir.

Android 9:

Her ön plan uygulaması, 2 dakikalık süre içinde dört kez tarama yapabilir. Bu sayede kısa sürede çok sayıda tarama yapılabilir.

Arka plandaki tüm uygulamalar birleştirildiğinde 30 dakikalık bir süre içinde bir kez tarama yapabilir.

Android 10 ve sonraki sürümler:

Android 9'daki aynı sıklık sınırlamaları geçerlidir. Yerel testlerde kısma özelliğini devre dışı bırakmak için yeni bir geliştirici seçeneği eklendi (Geliştirici Seçenekleri > Ağ > Kablosuz ağ taramasını kısma).