Kablosuz taramasına genel bakış

WifiManager API'yi kullanarak Cihazdan görülebilen kablosuz erişim noktaları.

Kablosuz ağ tarama 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 yapılan tüm tam kablosuz taramalarda 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. 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 nedenle, bu yöntemi çağırırsanız eski tarama sonuçlarını alabilirsiniz. bir test mesajı aldıktan sonra SCAN_RESULTS_AVAILABLE_ACTION yayınla.

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

KotlinJava
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 ...
}
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ığı.

Android 9 (API) ağ performansını, güvenliğini ve pil ömrünü iyileştirmek için 28. seviye) izin şartlarını sıkılaştırmış ve izin Kablosuz ağ taramaları.

İzinler

Android 8.0 ve Android 8.1:

WifiManager.getScanResults() işlevine başarılı bir çağrı yapmak için aşağıdaki izinlerden biri gereklidir:

Görüşme uygulaması bu izinlerden herhangi birine sahip değilse çağrı, SecurityException.

Alternatif olarak, Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazlarda: her bir arama terimi için CompanionDeviceManager aracını kullanmadan yakındaki tamamlayıcı cihazları uygulamanız adına tarar. Bu durumda konum izni gerekir. Bu seçenek hakkında daha fazla bilgi için Arkadaş cihaz eşleme başlıklı makaleyi inceleyin.

Android 9:

Şuna başarılı bir çağrı: WifiManager.startScan() aşağıdaki koşulların tümünün yerine getirilmesini gerektirir:

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

Şuna başarılı bir çağrı: WifiManager.startScan() aşağıdaki koşulların tümünün yerine getirilmesini gerektirir:

  • Uygulamanız, Android 10 (API düzeyi 29) SDK'sını veya sonraki sürümleri hedefliyorsa CANNOT TRANSLATE ACCESS_FINE_LOCATION izni gerekir.
  • Uygulamanız, Android 10'dan (API düzeyi 29) düşük bir SDK'yı hedefliyorsa CANNOT TRANSLATE ACCESS_COARSE_LOCATION veya ACCESS_FINE_LOCATION izni gerekir.
  • Uygulamanızda CHANGE_WIFI_STATE bulunuyor izni gerekir.
  • Konum hizmetlerinin cihazda etkinleştirilmesi (Ayarlar > Konum) tıklayın.

WifiManager.getScanResults() işlevini başarıyla çağırmak 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 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ız ACCESS_WIFI_STATE izni gerekir.
  • Konum hizmetlerinin cihazda etkinleştirilmesi (Ayarlar > Konum) tıklayın.

Arama uygulaması bu gereksinimlerin tümünü karşılamıyorsa çağrı SecurityException.

Kısıtlama

Aşağıdaki sınırlamalar, WifiManager.startScan().

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 çok fazla hata olduğunu fark ettim.

Tüm arka plan uygulamaları, 30 dakikalık bir 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.