Kablosuz taramasına genel bakış

Cihazdan görülebilen kablosuz erişim noktalarının listesini almak için WifiManager API tarafından sağlanan kablosuz tarama özelliklerini kullanabilirsiniz.

Kablosuz ağ taraması işlemi

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

  1. Tarama istekleri tamamlandığında çağrılan ve başarı/başarısızlık durumlarını sağlayan SCAN_RESULTS_AVAILABLE_ACTION için bir yayın dinleyicisi kaydedin. 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 tam kablosuz taramalarda gönderilir. Uygulamalar, kendi taramalarını yapmadan yayını kullanarak cihazdaki tüm tarama tamamlanmalarını pasif olarak dinleyebilir.

  2. WifiManager.startScan() simgesini kullanarak tarama isteğinde bulunun. Aşağıdaki nedenlerden biri nedeniyle çağrı başarısız olabileceğinden yöntemin döndürme durumunu kontrol edin:

    • Kısa süre içinde çok fazla tarama yapıldığı için tarama istekleri sınırlanabilir.
    • Cihaz boşta ve tarama devre dışıdır.
    • Kablosuz donanımı bir tarama hatası bildirir.
  3. WifiManager.getScanResults() simgesini kullanarak tarama sonuçlarını alın. 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 önceki bir taramadan 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 kablosuz tarama sıklığıyla ilgili kısıtlamalar getirdi.

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 tarama 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:

Arayan uygulamada bu izinlerden hiçbiri yoksa arama SecurityException hatasıyla 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 tamamlayıcı cihazları taramak için CompanionDeviceManager'i kullanabilirsiniz. Bu seçenek hakkında daha fazla bilgi için Arkadaş cihaz eşleme başlıklı makaleyi inceleyin.

Android 9:

WifiManager.startScan() işlevine yapılan çağrı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() işlevine yapılan çağrının başarılı olması 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 sürümü hedefliyorsa ACCESS_FINE_LOCATION iznine sahiptir.
  • Uygulamanız Android 10'dan (API düzeyi 29) daha düşük bir SDK'yı hedefliyorsa ACCESS_COARSE_LOCATION veya ACCESS_FINE_LOCATION iznine sahiptir.
  • Uygulamanızda CHANGE_WIFI_STATE izini var.
  • Cihazda konum hizmetleri etkinleştirilmiş olmalıdır (Ayarlar > Konum bölümünde).

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 daha yeni bir sürümü hedefliyorsa ACCESS_FINE_LOCATION iznine sahiptir.
  • Uygulamanız Android 10'dan (API düzeyi 29) daha düşük bir SDK'yı hedefliyorsa ACCESS_COARSE_LOCATION veya ACCESS_FINE_LOCATION iznine sahiptir.
  • Uygulamanızda ACCESS_WIFI_STATE izni var.
  • Cihazda konum hizmetleri etkinleştirilmiş olmalıdır (Ayarlar > Konum bölümünde).

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

Sınırlama

WifiManager.startScan() kullanan taramaların sıklığı için aşağıdaki sınırlamalar geçerlidir.

Android 8.0 ve Android 8.1:

Her arka plan uygulaması 30 dakika içinde bir kez taranabilir.

Android 9:

Her ön plan uygulaması 2 dakika içinde dört kez tarama yapabilir. Bu sayede kısa sürede çok sayıda tarama 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ı akış sınırlamaları geçerlidir. Yerel test için daraltmayı devre dışı bırakmak üzere yeni bir geliştirici seçeneği (Geliştirici Seçenekleri > Ağ > Kablosuz tarama daraltma bölümünde) mevcuttur.