WifiManager API'yi kullanarak Cihazdan görülebilen kablosuz erişim noktaları.
Kablosuz ağ taraması işlemi
Tarama işlemi üç adımdan oluşur:
Şunun için bir yayın dinleyicisi kaydedin:
SCAN_RESULTS_AVAILABLE_ACTION
, Bu işlem, tarama istekleri tamamlandığında çağrılır; tarama istekleri durumu hakkında bilgi edindiniz. Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran cihazlarda cihaz tarafından gerçekleştirilen tam kablosuz ağ taraması için bir yayın gönderilecektir. diğer uygulamalar da var. Uygulamalar tüm taramaları pasif olarak dinleyebilir taraması yapmadan yayını kullanarak cihazda tamamlamalarını sahip olmalıdır.Şunu kullanarak tarama isteğinde bulunun:
WifiManager.startScan()
. Çağrı başarısız olabileceği için yöntemin döndürme durumunu kontrol ettiğinizden emin olun aşağıdaki nedenlerden herhangi birine bağlı olarak:- 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.
Şunu kullanarak tarama sonuçlarını alın:
WifiManager.getScanResults()
. Döndürülen tarama sonuçları en son güncellenmiş sonuçlardır. önceki bir taramadan olabilir. Bu nedenle, bu yöntemi çağırırsanız eski tarama sonuçlarını alabilirsiniz. bir test mesajı aldıktan sonraSCAN_RESULTS_AVAILABLE_ACTION
yayınla.
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ığı.
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:
Şuna başarılı bir çağrı:
WifiManager.getScanResults()
aşağıdaki izinlerden herhangi birini gerektirir:
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çenekle ilgili daha fazla bilgi için
Tamamlayıcı cihaz
eşleme bölümünde bulabilirsiniz.
Android 9:
Şuna başarılı bir çağrı:
WifiManager.startScan()
aşağıdaki koşulların tümünün yerine getirilmesini gerektirir:
- Uygulamanız
ACCESS_FINE_LOCATION
veyaACCESS_COARSE_LOCATION
izni gerekir. - Uygulamanız
CHANGE_WIFI_STATE
izni gerekir. - Konum hizmetleri cihazda etkinleştirilir (Ayarlar > Konum altında).
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
veyaACCESS_FINE_LOCATION
izni gerekir. - Uygulamanızda
CHANGE_WIFI_STATE
bulunuyor izni gerekir. - Konum hizmetlerinin cihazda etkinleştirilmesi (Ayarlar > Konum) tıklayın.
Başarılı bir şekilde sesli arama yapmak için
WifiManager.getScanResults()
aşağıdaki koşulların tümünün sağlandığından emin olun:
- Uygulamanız, Android 10 (API düzeyi 29) SDK'sını veya sonraki sürümleri hedefliyorsa
ACCESS_FINE_LOCATION
iznine sahip. - Uygulamanız, Android 10'dan (API düzeyi 29) düşük bir SDK'yı hedefliyorsa
ACCESS_COARSE_LOCATION
veyaACCESS_FINE_LOCATION
iznine sahip. - 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ı 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. Yeni bir geliştirici seçeneği var kısıtlamayı kapatmak için (Geliştirici Seçenekleri > Ağ iletişimi > Kablosuz ağ taramasının kısıtlanması).