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 ağ taraması özelliklerini kullanabilirsiniz.

Kablosuz ağ taraması süreci

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

  1. Tarama istekleri tamamlandığında çağrılan ve başarılı/başarısız durumunu sağlayan SCAN_RESULTS_AVAILABLE_ACTION için bir yayın işleyicisi 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 tam kablosuz ağ taramalarının tümü için gönderilir. Uygulamalar, kendi taramalarını yapmadan yayın kullanarak cihazdaki tüm tarama tamamlamalarını pasif olarak işleyebilir.

  2. WifiManager.startScan() yöntemini kullanarak tarama isteğinde bulunun. Arama aşağıdaki nedenlerden biriyle başarısız olabileceğinden yöntemin return durumunu kontrol etmeyi unutmayın:

    • Kısa süre içinde çok fazla tarama yapıldığında tarama istekleri sınırlanabilir.
    • Cihaz boşta ve tarama devre dışı kalabilir.
    • Kablosuz donanım, tarama hatası bildirebilir.
  3. WifiManager.getScanResults() yöntemini 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 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 ağ taramalarının sıklığını daha da sınırladı.

İzinler

Android 8.0 ve Android 8.1:

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

Çağrı uygulamasında bu izinlerden herhangi biri yoksa ç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 gerektirmeden uygulamanız adına yakındaki yardımcı cihazların taranması için CompanionDeviceManager yöntemini kullanabilirsiniz. Bu seçenek hakkında daha fazla bilgi için Yardımcı cihaz eşleme başlıklı makaleyi inceleyin.

Android 9:

Başarılı bir WifiManager.startScan() çağrısı 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:

Başarılı bir WifiManager.startScan() çağrısı 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 uygulamanızda ACCESS_FINE_LOCATION izni olmalıdı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 olmalıdır.
  • Uygulamanızda CHANGE_WIFI_STATE izni olmalıdır.
  • Cihazda konum hizmetleri etkinleştirilmiş olmalıdır (Ayarlar > Konum bölümünde).

Başarılı bir WifiManager.getScanResults() çağrısı yapmak 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 sonraki sürümleri hedefliyorsa uygulamanızda ACCESS_FINE_LOCATION izni olmalıdı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 olmalıdır.
  • Uygulamanızda ACCESS_WIFI_STATE izni olmalıdır.
  • 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:

Arka planda çalışan her uygulama, 30 dakikalık bir süre içinde bir kez tarama yapabilir.

Android 9:

Ön planda çalışan her uygulama, 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 planda çalışan tüm uygulamalar birlikte, 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 sınırlamayı devre dışı bırakmak için yeni bir geliştirici seçeneği eklendi (Geliştirici Seçenekleri > Ağ işlemleri > Kablosuz ağ taramasını sınırlandır).