Kablosuz taramasına genel bakış

WifiManager API'nin sağladığı kablosuz ağ tarama özelliklerini kullanarak cihazdan görülebilen kablosuz erişim noktalarının listesini alabilirsiniz.

Kablosuz ağ taraması işlemi

Tarama işlemi üç adımdan oluşur:

  1. SCAN_RESULTS_AVAILABLE_ACTION için bir yayın dinleyici kaydedin. Bu işlev, tarama istekleri tamamlandığında çağrılan ve başarı/başarısızlık durumunu bildirir. Bu yayın, Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran cihazlarda platform veya diğer uygulamalar tarafından cihazda gerçekleştirilen tüm kablosuz ağ taraması için gönderilir. Uygulamalar, kendi taramalarını başlatmadan yayını kullanarak cihazdaki tüm tarama tamamlamalarını pasif olarak dinleyebilir.

  2. WifiManager.startScan() üzerinden tarama isteğinde bulunun. Çağrı, aşağıdaki nedenlerden herhangi biriyle başarısız olabileceği için yöntemin döndürme durumunu kontrol ettiğinizden emin olun:

    • Kısa süre içinde çok fazla tarama yapılması nedeniyle tarama istekleri kısıtlanabilir.
    • Cihaz boşta ve tarama devre dışı.
    • Kablosuz donanımı bir tarama hatası bildirir.
  3. WifiManager.getScanResults() kullanarak tarama sonuçları alın. Döndürülen tarama sonuçları, en son güncellenen sonuçlardır. Mevcut taramanız tamamlanmamışsa veya başarılı değilse bu sonuçlar önceki bir taramaya ait olabilir. Yani bu yöntemi başarılı bir SCAN_RESULTS_AVAILABLE_ACTION yayını almadan önce çağırırsanız eski tarama sonuçları alabilirsiniz.

Aşağıdaki kod, bu adımların nasıl uygulanacağına dair bir örnek sunar:

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 kablosuz ağ tarama sıklığı ile ilgili kısıtlamalar kullanıma sundu.

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ırıp kablosuz ağ taramalarının sıklığını daha da sınırlandırdı.

İzinler

Android 8.0 ve Android 8.1:

WifiManager.getScanResults() alanına yapılan başarılı bir çağrı için aşağıdaki izinlerden herhangi biri gerekir:

Arama uygulaması bu izinlerden herhangi birine sahip değilse çağrı, 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 gerekmeden yakındaki tamamlayıcı cihazları uygulamanız adına taramak için CompanionDeviceManager'ı kullanabilirsiniz. Bu seçenek hakkında daha fazla bilgi için Tamamlayıcı cihaz eşleme bölümüne bakın.

Android 9:

WifiManager.startScan() çağrısının başarılı olması 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() çağrısının başarılı olması için aşağıdaki koşulların tümünün karşılanması gerekir:

WifiManager.getScanResults() numarasını başarıyla çağırmak için aşağıdaki koşulların tümünün yerine getirildiğinden emin olun:

  • Uygulamanız Android 10 (API düzeyi 29) SDK'sını veya sonraki sürümleri hedefliyorsa ACCESS_FINE_LOCATION izni vardır.
  • Uygulamanız, Android 10'dan (API düzeyi 29) düşük bir SDK'yı hedefliyorsa ACCESS_COARSE_LOCATION veya ACCESS_FINE_LOCATION izni vardır.
  • Uygulamanız ACCESS_WIFI_STATE iznine sahip.
  • Konum hizmetleri cihazda etkinleştirilir (Ayarlar > Konum bölümünde).

Arama uygulaması bu gereksinimlerin tümünü karşılamıyorsa çağrı, SecurityException ile başarısız olur.

Kısıtlama

WifiManager.startScan() kullanılarak yapılan tarama sıklığı için 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 şekilde kısa sürede seri işlem yapabilirsiniz.

Tüm arka plan uygulamaları birlikte 30 dakikalık süre içinde bir kez tarama yapabilir.

Android 10 ve sonraki sürümler:

Android 9'daki aynı kısıtlama sınırları geçerlidir. Yerel test için kısıtlamayı kapatabileceğiniz yeni bir geliştirici seçeneği var (Geliştirici Seçenekleri > Ağ iletişimi > Kablosuz taraması kısıtlama altında).