वाई-फ़ाई स्कैनिंग की खास जानकारी

आप इसके द्वारा उपलब्ध कराई गई वाई-फ़ाई स्कैनिंग क्षमताओं का उपयोग कर सकते हैं WifiManager API का इस्तेमाल करके डिवाइस से दिखने वाले वाई-फ़ाई ऐक्सेस पॉइंट.

वाई-फ़ाई स्कैन करने की प्रोसेस

स्कैन करने की प्रोसेस तीन चरणों में होती है:

  1. इसके लिए, ब्रॉडकास्ट लिसनर रजिस्टर करें SCAN_RESULTS_AVAILABLE_ACTION, इसे तब कॉल किया जाता है, जब स्कैन के अनुरोध पूरे हो जाते हैं. सफल/असफल स्थिति. Android 10 (एपीआई लेवल 29) और उसके बाद के वर्शन वाले डिवाइसों के लिए, यह डिवाइस पर पूरे वाई-फ़ाई स्कैन करने पर ब्रॉडकास्ट को इस तरह भेजा जाएगा प्लैटफ़ॉर्म या अन्य ऐप्लिकेशन का इस्तेमाल करते हैं. ऐप्लिकेशन, लोगों को स्कैन करते समय सुनने की सुविधा इस्तेमाल कर सकते हैं अपने डिवाइस पर ब्रॉडकास्ट मैसेज का इस्तेमाल करके, अपने वीडियो को पूरा देखे जाने के साथ-साथ, मालिकाना हक है.

  2. इसका इस्तेमाल करके स्कैन का अनुरोध करें WifiManager.startScan(). इस तरीके की, सामान लौटाने की स्थिति ज़रूर देखें, क्योंकि हो सकता है कि कॉल न हो पाए इनमें से कोई भी वजह हो सकती है:

    • कम समय में बहुत ज़्यादा स्कैन करने की वजह से, स्कैन करने के अनुरोध रोके जा सकते हैं.
    • डिवाइस कुछ समय से इस्तेमाल में नहीं है और स्कैन करने की सुविधा बंद है.
    • वाई-फ़ाई हार्डवेयर, स्कैन नहीं होने की शिकायत करता है.
  3. इसका इस्तेमाल करके स्कैन के नतीजे पाएं 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) या उसके बाद के वर्शन को टारगेट करता है, तो आपका ऐप्लिकेशन है ACCESS_FINE_LOCATION अनुमति.
  • अगर आपका ऐप्लिकेशन, Android 10 (एपीआई लेवल 29) से नीचे के SDK टूल को टारगेट कर रहा है, तो है ACCESS_COARSE_LOCATION या ACCESS_FINE_LOCATION अनुमति.
  • आपके ऐप्लिकेशन में CHANGE_WIFI_STATE अनुमति.
  • डिवाइस पर, जगह की जानकारी की सुविधा चालू हो. इसके लिए, सेटिंग > जगह की जानकारी).

कॉल करने के लिए WifiManager.getScanResults() पक्का करें कि नीचे दी गई सभी शर्तें पूरी होती हों:

  • अगर आपका ऐप्लिकेशन, Android 10 (एपीआई लेवल 29) या उसके बाद के वर्शन को टारगेट करता है, तो आपका ऐप्लिकेशन के पास ACCESS_FINE_LOCATION की अनुमति है.
  • अगर आपका ऐप्लिकेशन, Android 10 (एपीआई लेवल 29) से नीचे के SDK टूल को टारगेट कर रहा है, तो के पास 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 में भी थ्रॉटलिंग की यही सीमाएं लागू होती हैं. डेवलपर के लिए एक नया विकल्प उपलब्ध है स्थानीय जांच के लिए थ्रॉटलिंग को बंद करने के लिए (डेवलपर के लिए सेटिंग और टूल > नेटवर्किंग > वाई-फ़ाई स्कैन थ्रॉटलिंग).