WifiManager API की मदद से, वाई-फ़ाई स्कैन करने की सुविधाओं का इस्तेमाल किया जा सकता है. इससे, डिवाइस से दिखने वाले वाई-फ़ाई ऐक्सेस पॉइंट की सूची देखी जा सकती है.
वाई-फ़ाई स्कैन करने की प्रोसेस
स्कैन करने की प्रोसेस के तीन चरण होते हैं:
SCAN_RESULTS_AVAILABLE_ACTIONके लिए, ब्रॉडकास्ट लिसनर को रजिस्टर करें. इसे स्कैन के अनुरोध पूरे होने पर कॉल किया जाता है. इससे अनुरोधों के पूरा होने या न होने की स्थिति का पता चलता है. Android 10 (एपीआई लेवल 29) और इसके बाद के वर्शन वाले डिवाइसों के लिए, यह ब्रॉडकास्ट तब भेजा जाएगा, जब प्लैटफ़ॉर्म या अन्य ऐप्लिकेशन, डिवाइस पर वाई-फ़ाई की पूरी जांच करेंगे. ऐप्लिकेशन, ब्रॉडकास्ट का इस्तेमाल करके डिवाइस पर स्कैन की गई सभी चीज़ों को सुन सकते हैं. इसके लिए, उन्हें खुद स्कैन करने की ज़रूरत नहीं होती.WifiManager.startScan()का इस्तेमाल करके, स्कैन करने का अनुरोध करें. यह पक्का करें कि आपने फ़ंक्शन के रिटर्न स्टेटस की जांच की हो, क्योंकि कॉल इनमें से किसी वजह से फ़ेल हो सकता है:- कम समय में बहुत ज़्यादा स्कैन करने की वजह से, स्कैन करने के अनुरोधों को कम किया जा सकता है.
- डिवाइस कुछ समय से इस्तेमाल में नहीं है और स्कैनिंग की सुविधा बंद है.
- वाई-फ़ाई हार्डवेयर, स्कैन न हो पाने की रिपोर्ट करता है.
WifiManager.getScanResults()का इस्तेमाल करके, स्कैन के नतीजे पाएं. स्कैन के नतीजे, हाल ही में अपडेट किए गए नतीजे होते हैं. अगर आपका मौजूदा स्कैन पूरा या सफल नहीं हुआ है, तो ये नतीजे पिछले स्कैन के हो सकते हैं. इसका मतलब है कि अगर आपनेSCAN_RESULTS_AVAILABLE_ACTIONब्रॉडकास्ट मिलने से पहले इस तरीके को कॉल किया, तो आपको स्कैन के पुराने नतीजे मिल सकते हैं.
यहां दिए गए कोड में, इन चरणों को लागू करने का उदाहरण दिया गया है:
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 ... }
पाबंदियां
Android 8.0 (एपीआई लेवल 26) में, अनुमतियों और वाई-फ़ाई स्कैन की फ़्रीक्वेंसी से जुड़ी पाबंदियां लागू की गई हैं.
नेटवर्क की परफ़ॉर्मेंस, सुरक्षा, और बैटरी लाइफ़ को बेहतर बनाने के लिए, Android 9 (एपीआई लेवल 28) में अनुमतियों से जुड़ी ज़रूरी शर्तों को और सख्त किया गया है. साथ ही, वाई-फ़ाई स्कैन की फ़्रीक्वेंसी को और सीमित किया गया है.
अनुमतियां
Android 8.0 और Android 8.1:
WifiManager.getScanResults()
को कॉल करने के लिए, इनमें से कोई एक अनुमति ज़रूरी है:
अगर कॉलिंग ऐप्लिकेशन के पास इनमें से कोई भी अनुमति नहीं है, तो कॉल नहीं किया जा सकेगा और आपको SecurityException दिखेगा.
इसके अलावा, Android 8.0 (एपीआई लेवल 26) और इसके बाद के वर्शन वाले डिवाइसों पर,
CompanionDeviceManager
का इस्तेमाल करके, अपने ऐप्लिकेशन की ओर से आस-पास मौजूद कंपैनियन डिवाइसों को स्कैन किया जा सकता है. इसके लिए, जगह की जानकारी की अनुमति की ज़रूरत नहीं होती. इस विकल्प के बारे में ज़्यादा जानने के लिए, कंपैनियन डिवाइस को जोड़ना लेख पढ़ें.
Android 9:
WifiManager.startScan()
को कॉल करने के लिए, ये सभी शर्तें पूरी होनी चाहिए:
- आपके ऐप्लिकेशन के पास
ACCESS_FINE_LOCATIONयाACCESS_COARSE_LOCATIONकी अनुमति है. - आपके ऐप्लिकेशन के पास
CHANGE_WIFI_STATEकी अनुमति है. - डिवाइस पर जगह की जानकारी की सुविधा चालू हो. इसके लिए, सेटिंग > जगह की जानकारी पर जाएं.
Android 10 (एपीआई लेवल 29) और इसके बाद के वर्शन:
WifiManager.startScan()
को कॉल करने के लिए, ये सभी शर्तें पूरी होनी चाहिए:
- अगर आपका ऐप्लिकेशन, Android 10 (एपीआई लेवल 29) SDK या इसके बाद के वर्शन को टारगेट करता है, तो आपके ऐप्लिकेशन के पास
ACCESS_FINE_LOCATIONअनुमति है. - अगर आपका ऐप्लिकेशन, Android 10 (एपीआई लेवल 29) से पहले के एसडीके को टारगेट करता है, तो आपके ऐप्लिकेशन के पास
ACCESS_COARSE_LOCATIONयाACCESS_FINE_LOCATIONकी अनुमति होनी चाहिए. - आपके ऐप्लिकेशन के पास
CHANGE_WIFI_STATEकी अनुमति है. - डिवाइस पर जगह की जानकारी की सुविधा चालू हो. इसके लिए, सेटिंग > जगह की जानकारी पर जाएं.
WifiManager.getScanResults() को कॉल करने के लिए, पक्का करें कि ये सभी शर्तें पूरी हों:
- अगर आपका ऐप्लिकेशन, Android 10 (एपीआई लेवल 29) SDK या इसके बाद के वर्शन को टारगेट करता है, तो आपके ऐप्लिकेशन के पास
ACCESS_FINE_LOCATIONअनुमति है. - अगर आपका ऐप्लिकेशन, Android 10 (एपीआई लेवल 29) से पहले के एसडीके को टारगेट करता है, तो आपके ऐप्लिकेशन के पास
ACCESS_COARSE_LOCATIONयाACCESS_FINE_LOCATIONकी अनुमति होनी चाहिए. - आपके ऐप्लिकेशन के पास
ACCESS_WIFI_STATEकी अनुमति है. - डिवाइस पर जगह की जानकारी की सुविधा चालू हो. इसके लिए, सेटिंग > जगह की जानकारी पर जाएं.
अगर कॉलिंग ऐप्लिकेशन इनमें से सभी ज़रूरी शर्तें पूरी नहीं करता है, तो कॉल नहीं किया जा सकेगा और आपको SecurityException दिखेगा.
थ्रॉटलिंग
WifiManager.startScan() का इस्तेमाल करके स्कैन करने की फ़्रीक्वेंसी पर, ये सीमाएं लागू होती हैं.
Android 8.0 और Android 8.1:
बैकग्राउंड में चल रहा हर ऐप्लिकेशन, 30 मिनट में एक बार स्कैन कर सकता है.
Android 9:
हर फ़ोरग्राउंड ऐप्लिकेशन, दो मिनट में चार बार स्कैन कर सकता है. इससे कम समय में कई बार स्कैन किया जा सकता है.
बैकग्राउंड में चल रहे सभी ऐप्लिकेशन, 30 मिनट में एक बार स्कैन कर सकते हैं.
Android 10 और इसके बाद के वर्शन के लिए:
Android 9 में लागू की गई थ्रॉटलिंग की सीमाएं ही लागू होती हैं. लोकल टेस्टिंग के लिए, थ्रॉटलिंग को टॉगल करके बंद करने का एक नया डेवलपर विकल्प है. इसके लिए, डेवलपर के लिए सेटिंग और टूल > नेटवर्किंग > वाई-फ़ाई स्कैन थ्रॉटलिंग पर जाएं.