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

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

Wi-Fi স্ক্যানিং প্রক্রিয়া

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

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

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

    • অল্প সময়ের মধ্যে অনেক বেশি স্ক্যানের কারণে স্ক্যানের অনুরোধ থ্রোটল হতে পারে।
    • ডিভাইসটি নিষ্ক্রিয় এবং স্ক্যানিং অক্ষম।
    • Wi-Fi হার্ডওয়্যার একটি স্ক্যান ব্যর্থতার রিপোর্ট করে৷
  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 ...
}

বিধিনিষেধ

Android 8.0 (API স্তর 26) অনুমতি এবং Wi-Fi স্ক্যানের অনুমোদিত ফ্রিকোয়েন্সি সম্পর্কিত বিধিনিষেধ চালু করেছে।

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

অনুমতি

Android 8.0 এবং Android 8.1:

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

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

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

Android 9:

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

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

Android 10 (API স্তর 29) এবং উচ্চতর:

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:

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

Android 9:

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

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

Android 10 এবং উচ্চতর:

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

,

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

Wi-Fi স্ক্যানিং প্রক্রিয়া

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

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

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

    • অল্প সময়ের মধ্যে অনেক বেশি স্ক্যানের কারণে স্ক্যানের অনুরোধ থ্রোটল হতে পারে।
    • ডিভাইসটি নিষ্ক্রিয় এবং স্ক্যানিং অক্ষম।
    • Wi-Fi হার্ডওয়্যার একটি স্ক্যান ব্যর্থতার রিপোর্ট করে৷
  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 ...
}

বিধিনিষেধ

Android 8.0 (API স্তর 26) অনুমতি এবং Wi-Fi স্ক্যানের অনুমোদিত ফ্রিকোয়েন্সি সম্পর্কিত বিধিনিষেধ চালু করেছে।

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

অনুমতি

Android 8.0 এবং Android 8.1:

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

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

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

Android 9:

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

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

Android 10 (API স্তর 29) এবং উচ্চতর:

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:

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

Android 9:

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

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

Android 10 এবং উচ্চতর:

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

,

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

Wi-Fi স্ক্যানিং প্রক্রিয়া

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

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

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

    • অল্প সময়ের মধ্যে অনেক বেশি স্ক্যানের কারণে স্ক্যানের অনুরোধ থ্রোটল হতে পারে।
    • ডিভাইসটি নিষ্ক্রিয় এবং স্ক্যানিং অক্ষম।
    • Wi-Fi হার্ডওয়্যার একটি স্ক্যান ব্যর্থতার রিপোর্ট করে৷
  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 ...
}

বিধিনিষেধ

Android 8.0 (API স্তর 26) অনুমতি এবং Wi-Fi স্ক্যানের অনুমোদিত ফ্রিকোয়েন্সি সম্পর্কিত বিধিনিষেধ চালু করেছে।

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

অনুমতি

Android 8.0 এবং Android 8.1:

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

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

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

Android 9:

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

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

Android 10 (API স্তর 29) এবং উচ্চতর:

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:

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

Android 9:

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

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

Android 10 এবং উচ্চতর:

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

,

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

Wi-Fi স্ক্যানিং প্রক্রিয়া

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

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

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

    • অল্প সময়ের মধ্যে অনেক বেশি স্ক্যানের কারণে স্ক্যানের অনুরোধ থ্রোটল হতে পারে।
    • ডিভাইসটি নিষ্ক্রিয় এবং স্ক্যানিং অক্ষম।
    • Wi-Fi হার্ডওয়্যার একটি স্ক্যান ব্যর্থতার রিপোর্ট করে৷
  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 ...
}

বিধিনিষেধ

Android 8.0 (API স্তর 26) অনুমতি এবং Wi-Fi স্ক্যানের অনুমোদিত ফ্রিকোয়েন্সি সম্পর্কিত বিধিনিষেধ চালু করেছে।

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

অনুমতি

Android 8.0 এবং Android 8.1:

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

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

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

Android 9:

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

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

Android 10 (API স্তর 29) এবং উচ্চতর:

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:

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

Android 9:

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

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

Android 10 এবং উচ্চতর:

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