Wi-Fi স্ক্যানিং ওভারভিউ

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

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

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

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

  2. WifiManager.startScan() ব্যবহার করে স্ক্যানের অনুরোধ করুন । পদ্ধতির রিটার্ন স্ট্যাটাস পরীক্ষা করে দেখুন, কারণ নিম্নলিখিত যেকোনো কারণে কলটি ব্যর্থ হতে পারে:

    • অল্প সময়ের মধ্যে অনেক বেশি স্ক্যানের কারণে স্ক্যান অনুরোধগুলি থ্রোটলড হতে পারে।
    • ডিভাইসটি নিষ্ক্রিয় এবং স্ক্যানিং অক্ষম করা আছে।
    • ওয়াই-ফাই হার্ডওয়্যার স্ক্যান ব্যর্থতার রিপোর্ট করেছে।
  3. WifiManager.getScanResults() ব্যবহার করে স্ক্যানের ফলাফল পান । ফিরে আসা স্ক্যানের ফলাফল হল সাম্প্রতিক আপডেট করা ফলাফল, যা আপনার বর্তমান স্ক্যানটি সম্পন্ন না হলে বা সফল না হলে পূর্ববর্তী স্ক্যান থেকে হতে পারে। এর অর্থ হল, সফল SCAN_RESULTS_AVAILABLE_ACTION সম্প্রচার পাওয়ার আগে আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে আপনি পুরানো স্ক্যানের ফলাফল পেতে পারেন।

নিম্নলিখিত কোডটি এই পদক্ষেপগুলি কীভাবে বাস্তবায়ন করতে হয় তার একটি উদাহরণ প্রদান করে:

কোটলিন

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

বিধিনিষেধ

অ্যান্ড্রয়েড ৮.০ (এপিআই লেভেল ২৬) ওয়াই-ফাই স্ক্যানের অনুমতি এবং অনুমোদিত ফ্রিকোয়েন্সি সম্পর্কিত বিধিনিষেধ চালু করেছে।

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

অনুমতিসমূহ

অ্যান্ড্রয়েড ৮.০ এবং অ্যান্ড্রয়েড ৮.১:

WifiManager.getScanResults() এ একটি সফল কলের জন্য নিম্নলিখিত যেকোনো একটি অনুমতির প্রয়োজন:

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

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

অ্যান্ড্রয়েড ৯:

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

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

অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) এবং উচ্চতর:

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() ব্যবহার করে স্ক্যানের ফ্রিকোয়েন্সির ক্ষেত্রে নিম্নলিখিত সীমাবদ্ধতাগুলি প্রযোজ্য।

অ্যান্ড্রয়েড ৮.০ এবং অ্যান্ড্রয়েড ৮.১:

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

অ্যান্ড্রয়েড ৯:

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

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

অ্যান্ড্রয়েড ১০ এবং উচ্চতর:

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