Mencari perangkat BLE

Untuk menemukan perangkat BLE, Anda menggunakan metode startScan() . Metode ini memerlukan ScanCallback sebagai parameter. Anda harus menerapkan callback ini, karena itulah cara hasil pemindaian ditampilkan. Karena pemindaian membutuhkan baterai, Anda harus mengamati hal-hal berikut panduan:

  • Begitu Anda menemukan perangkat yang diinginkan, hentikan pemindaian.
  • Jangan pernah memindai dalam loop, dan selalu tetapkan batas waktu pada pemindaian Anda. Perangkat yang sebelumnya tersedia mungkin telah dipindahkan di luar jangkauan, dan terus memindai menghabiskan baterai.

Pada contoh berikut, aplikasi BLE menyediakan aktivitas (DeviceScanActivity) untuk memindai perangkat dan layar Bluetooth LE yang tersedia data tersebut dalam daftar kepada pengguna. Cuplikan berikut ini menunjukkan cara memulai dan menghentikan pindai:

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

Untuk memindai jenis periferal tertentu saja, Anda dapat memanggil startScan(List<ScanFilter>, ScanSettings, ScanCallback), memberikan daftar ScanFilter objek yang membatasi perangkat yang dicari oleh pemindaian dan ScanSettings yang menentukan parameter tentang pemindaian.

Contoh kode berikut adalah implementasi ScanCallback, yang merupakan antarmuka yang digunakan untuk memberikan hasil pemindaian BLE. Saat hasil ditemukan, parameter tersebut akan ditambahkan ke adaptor daftar di DeviceScanActivity untuk ditampilkan ke .

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