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

বিধিনিষেধ

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

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

অনুমতি

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

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

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

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

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

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

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

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

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

  • আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) এসডিকে বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে আপনার অ্যাপটিতে ACCESS_FINE_LOCATION পারমিশনটি থাকবে।
  • আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯)-এর চেয়ে নিম্নতর এসডিকে টার্গেট করে, তাহলে আপনার অ্যাপটিতে ACCESS_COARSE_LOCATION অথবা ACCESS_FINE_LOCATION পারমিশন থাকবে।
  • আপনার অ্যাপটির CHANGE_WIFI_STATE পারমিশন আছে।
  • ডিভাইসে অবস্থান পরিষেবা চালু করা আছে ( সেটিংস > অবস্থান-এর অধীনে)।

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

  • আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) এসডিকে বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে আপনার অ্যাপটিতে ACCESS_FINE_LOCATION পারমিশনটি থাকবে।
  • আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯)-এর চেয়ে নিম্নতর এসডিকে টার্গেট করে, তাহলে আপনার অ্যাপটিতে ACCESS_COARSE_LOCATION অথবা ACCESS_FINE_LOCATION পারমিশন থাকবে।
  • আপনার অ্যাপটির ACCESS_WIFI_STATE পারমিশন আছে।
  • ডিভাইসে অবস্থান পরিষেবা চালু করা আছে ( সেটিংস > অবস্থান-এর অধীনে)।

যদি কলিং অ্যাপটি এই সমস্ত শর্ত পূরণ না করে, তাহলে একটি SecurityException সহ কলটি ব্যর্থ হয়।

থ্রটলিং

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

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

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

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

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

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

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

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