ওয়াই-ফাই স্ক্যানিং ওভারভিউ

আপনি WifiManager API-এর মাধ্যমে প্রদান করা ওয়াই-ফাই স্ক্যানিংয়ের সুবিধা ব্যবহার করে ডিভাইস থেকে দেখা যায় এমন ওয়াই-ফাই অ্যাক্সেস পয়েন্টের তালিকা পেতে পারেন।

ওয়াই-ফাই স্ক্যানিং প্রসেস

স্ক্যানিং প্রসেসের তিনটি ধাপ আছে:

  1. SCAN_RESULTS_AVAILABLE_ACTION-এর জন্য ব্রডকাস্ট লিসেনার রেজিস্টার করুন, স্ক্যান করার অনুরোধ সম্পূর্ণ হলে এটি কল করা হয় এবং সাফল্য/ব্যর্থতার স্ট্যাটাস প্রদান করে। Android 10 (API লেভেল ২৯) এবং তার পরবর্তী ভার্সনে চলা ডিভাইসের ক্ষেত্রে, প্ল্যাটফর্ম বা অন্যান্য অ্যাপের মাধ্যমে ডিভাইসে করা যেকোনও সম্পূর্ণ ওয়াই-ফাই স্ক্যানের জন্য এই ব্রডকাস্ট পাঠানো হবে। অ্যাপগুলি ব্রডকাস্ট ব্যবহার করে ডিভাইসে সমস্ত স্ক্যান সম্পূর্ণ হওয়ার ঘটনা প্যাসিভভাবে শুনতে পারে, এর জন্য তাদের নিজস্ব স্ক্যান ইস্যু করার প্রয়োজন হয় না।

  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 ...
}

জাভা

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 (API লেভেল ২৬) ভার্সনে অনুমতি ও ওয়াই-ফাই স্ক্যানের অনুমোদিত ফ্রিকোয়েন্সি সংক্রান্ত বিধিনিষেধ প্রবর্তন করা হয়েছে।

নেটওয়ার্ক পারফর্ম্যান্স, নিরাপত্তা ও ব্যাটারির আয়ু উন্নত করতে, Android 9 (API লেভেল ২৮) অনুমতির প্রয়োজনীয়তা আরও কঠোর করেছে এবং ওয়াই-ফাই স্ক্যানের ফ্রিকোয়েন্সি আরও সীমিত করেছে।

অনুমতি

Android 8.0 ও Android 8.1:

WifiManager.getScanResults()-এ সফলভাবে কল করতে হলে নিম্নলিখিত অনুমতিগুলির মধ্যে যেকোনও একটি প্রয়োজন:

কলিং অ্যাপের কাছে এইসব অনুমতির কোনও একটি না থাকলে, কল করা যাবে না এবং SecurityException দেখানো হবে।

বিকল্প হিসেবে, Android 8.0 (API লেভেল ২৬) এবং তার পরবর্তী ভার্সন চলছে এমন ডিভাইসে, আপনি CompanionDeviceManager ব্যবহার করে লোকেশন সংক্রান্ত অনুমতি ছাড়াই আপনার অ্যাপের হয়ে কাছাকাছি থাকা কম্প্যানিয়ন ডিভাইস স্ক্যান করতে পারবেন। এই বিকল্প সম্পর্কে আরও জানতে, কম্প্যানিয়ন ডিভাইস পেয়ারিং দেখুন।

Android 9:

WifiManager.startScan()-এ কল করার জন্য নিম্নলিখিত সব শর্ত পূরণ করতে হবে:

  • আপনার অ্যাপের কাছে ACCESS_FINE_LOCATION অথবা ACCESS_COARSE_LOCATION অনুমতি আছে।
  • আপনার অ্যাপের কাছে CHANGE_WIFI_STATE অনুমতি আছে।
  • ডিভাইসে লোকেশন পরিষেবা চালু করা আছে (সেটিংস > লোকেশন বিকল্পের অধীনে)।

Android 10 (API লেভেল ২৯) ও তার পরবর্তী যেকোনও ভার্সন:

WifiManager.startScan()-এ কল করার জন্য নিম্নলিখিত সব শর্ত পূরণ করতে হবে:

  • আপনার অ্যাপ Android 10 (API লেভেল 29) SDK বা তার পরবর্তী ভার্সনকে টার্গেট করলে, আপনার অ্যাপের কাছে ACCESS_FINE_LOCATION অনুমতি আছে।
  • আপনার অ্যাপ Android 10 (API লেভেল 29)-এর চেয়ে কম SDK টার্গেট করলে, আপনার অ্যাপের ACCESS_COARSE_LOCATION বা ACCESS_FINE_LOCATION অনুমতি আছে।
  • আপনার অ্যাপের কাছে CHANGE_WIFI_STATE অনুমতি আছে।
  • ডিভাইসে লোকেশন পরিষেবা চালু করা আছে (সেটিংস > লোকেশন বিকল্পের মধ্যে)।

WifiManager.getScanResults()-কে সফলভাবে কল করতে, নিশ্চিত করুন যে নিম্নলিখিত সব শর্ত পূরণ করা হয়েছে:

  • আপনার অ্যাপ Android 10 (API লেভেল 29) SDK বা তার পরবর্তী ভার্সনকে টার্গেট করলে, আপনার অ্যাপের ACCESS_FINE_LOCATION অনুমতি আছে।
  • আপনার অ্যাপ Android 10 (API লেভেল 29)-এর চেয়ে পুরনো SDK টার্গেট করলে, আপনার অ্যাপের ACCESS_COARSE_LOCATION বা ACCESS_FINE_LOCATION অনুমতি আছে।
  • আপনার অ্যাপের কাছে ACCESS_WIFI_STATE অনুমতি আছে।
  • ডিভাইসে লোকেশন পরিষেবা চালু করা আছে (সেটিংস > লোকেশন বিকল্পে)।

কলিং অ্যাপ এইসব প্রয়োজনীয়তা পূরণ না করলে, SecurityException-এর সাথে কল কেটে যায়।

থ্রটলিং

WifiManager.startScan() ব্যবহার করে স্ক্যান করার ফ্রিকোয়েন্সির ক্ষেত্রে নিম্নলিখিত সীমাবদ্ধতা প্রযোজ্য।

Android 8.0 ও Android 8.1:

ব্যাকগ্রাউন্ডে চলা প্রতিটি অ্যাপ ৩০ মিনিটের মধ্যে একবার স্ক্যান করতে পারে।

Android 9:

প্রতিটি ফোরগ্রাউন্ড অ্যাপ ২ মিনিটের মধ্যে চারবার স্ক্যান করতে পারে। এর ফলে অল্প সময়ের মধ্যে অনেক স্ক্যান করা যায়।

ব্যাকগ্রাউন্ডে চলা সব অ্যাপ ৩০ মিনিটের মধ্যে একবার স্ক্যান করতে পারে।

Android 10 ও তার পরবর্তী যেকোনও ভার্সন:

Android 9-এর থ্রটলিং সীমা প্রযোজ্য। লোকাল টেস্টিংয়ের জন্য থ্রটলিং বন্ধ করতে নতুন ডেভেলপার বিকল্প আছে (ডেভেলপার বিকল্প > নেটওয়ার্কিং > ওয়াই-ফাই স্ক্যান থ্রটলিং বিকল্পের অধীনে)।