العثور على أجهزة BLE

للعثور على أجهزة BLE، يمكنك استخدام الطريقة startScan(). تأخذ هذه الطريقة ScanCallback كمَعلمة. يجب تنفيذ معاودة الاتصال هذه، لأنّها هي الطريقة التي يتم بها عرض نتائج الفحص. ونظرًا لأن المسح يستهلك طاقة بطارية، يجب عليك مراعاة الإرشادات التالية:

  • بعد العثور على الجهاز المطلوب، أوقِف البحث.
  • لا تفحص البيانات بشكل متكرر مطلقًا، واضبُط حدًا زمنيًا دائمًا لذلك البحث. ربما يكون الجهاز الذي كان متاحًا في السابق قد خرج من النطاق، واستمر في فحص استهلاك البطارية.

في المثال التالي، يوفّر تطبيق BLE نشاطًا (DeviceScanActivity) للبحث عن أجهزة Bluetooth LE المتوفّرة وعرضها في قائمة للمستخدم. يوضح المقتطف التالي كيفية بدء عملية فحص وإيقافها:

Kotlin

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

Java

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 لعرضها للمستخدم.

Kotlin

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()
    }
}

Java

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();
            }
        };