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:
Tarama istekleri tamamlandığında çağrılan ve başarılı/başarısız durumunu sağlayan
SCAN_RESULTS_AVAILABLE_ACTIONiç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.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.
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ı birSCAN_RESULTS_AVAILABLE_ACTIONyayı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:
- Uygulamanızda
ACCESS_FINE_LOCATIONveyaACCESS_COARSE_LOCATIONizni olmalıdır. - Uygulamanızda
CHANGE_WIFI_STATEizni olmalıdır. - Cihazda konum hizmetleri etkinleştirilmiş olmalıdır (Ayarlar > Konum bölümünde).
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_LOCATIONizni olmalıdır. - Uygulamanız Android 10'dan (API düzeyi 29) daha düşük bir SDK'yı hedefliyorsa uygulamanızda
ACCESS_COARSE_LOCATIONveyaACCESS_FINE_LOCATIONizni olmalıdır. - Uygulamanızda
CHANGE_WIFI_STATEizni 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_LOCATIONizni olmalıdır. - Uygulamanız Android 10'dan (API düzeyi 29) daha düşük bir SDK'yı hedefliyorsa uygulamanızda
ACCESS_COARSE_LOCATIONveyaACCESS_FINE_LOCATIONizni olmalıdır. - Uygulamanızda
ACCESS_WIFI_STATEizni 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).