برای پیدا کردن دستگاههای BLE، از روش
startScan()
استفاده میکنید. این روش
ScanCallback را بهعنوان پارامتر میگیرد.
باید این فراخوانی برگشتی را پیادهسازی کنید، زیرا نتایج اسکن از این طریق برگردانده میشود.
چون اسکن کردن مصرف باتری بالایی دارد، باید دستورالعملهای زیر را رعایت کنید:
- بهمحض اینکه دستگاه موردنظر را پیدا کردید، اسکن کردن را متوقف کنید.
- هرگز بهصورت حلقهای اسکن نکنید و همیشه برای اسکن خود محدودیت زمانی تعیین کنید. دستگاهی که قبلاً دردسترس بود ممکن است از محدوده خارج شده باشد و ادامه اسکن کردن باعث تخلیه باتری میشود.
در مثال زیر، برنامه BLE فعالیتی (DeviceScanActivity) را برای اسکن کردن دستگاههای «بلوتوث کممصرف» دردسترس و نمایش آنها در فهرستی به کاربر ارائه میدهد. قطعه کد زیر نحوه شروع و توقف اسکن را نشان میدهد:
کاتلین
private val bluetoothLeScanner = bluetoothAdapter.bluetoothLeScanner private var scanning = false private val handler = Handler() // Stops scanning after 10 seconds. private val SCAN_PERIOD: Long = 10000 private fun scanLeDevice() { if (!scanning) { // Stops scanning after a pre-defined scan period. handler.postDelayed({ scanning = false bluetoothLeScanner.stopScan(leScanCallback) }, SCAN_PERIOD) scanning = true bluetoothLeScanner.startScan(leScanCallback) } else { scanning = false bluetoothLeScanner.stopScan(leScanCallback) } }
جاوا
private BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner(); private boolean scanning; private Handler handler = new Handler(); // Stops scanning after 10 seconds. private static final long SCAN_PERIOD = 10000; private void scanLeDevice() { if (!scanning) { // Stops scanning after a predefined scan period. handler.postDelayed(new Runnable() { @Override public void run() { scanning = false; bluetoothLeScanner.stopScan(leScanCallback); } }, SCAN_PERIOD); scanning = true; bluetoothLeScanner.startScan(leScanCallback); } else { scanning = false; bluetoothLeScanner.stopScan(leScanCallback); } }
برای اسکن کردن فقط انواع خاصی از لوازم جانبی، میتوانید بهجای آن
startScan(List<ScanFilter>, ScanSettings, ScanCallback) را فراخوانی کنید،
فهرستی از اشیاء ScanFilter
ارائه دهید که دستگاههایی را که اسکن بهدنبال آنها میگردد محدود میکند، و یک
شیء ScanSettings که
پارامترهای مربوط به اسکن را مشخص میکند.
نمونه کد زیر پیادهسازی
ScanCallback است،
که میانای مورداستفاده برای ارائه نتایج اسکن BLE است. وقتی نتایج پیدا شد،
به آداپتور فهرست در DeviceScanActivity اضافه میشود تا به
کاربر نمایش داده شود.
کاتلین
private val leDeviceListAdapter = LeDeviceListAdapter() // Device scan callback. private val leScanCallback: ScanCallback = object : ScanCallback() { override fun onScanResult(callbackType: Int, result: ScanResult) { super.onScanResult(callbackType, result) leDeviceListAdapter.addDevice(result.device) leDeviceListAdapter.notifyDataSetChanged() } }
جاوا
private LeDeviceListAdapter leDeviceListAdapter = new LeDeviceListAdapter(); // Device scan callback. private ScanCallback leScanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { super.onScanResult(callbackType, result); leDeviceListAdapter.addDevice(result.getDevice()); leDeviceListAdapter.notifyDataSetChanged(); } };