저전력 블루투스 기기 찾기

BLE 기기를 찾으려면 startScan() 메서드를 사용합니다. 이 메서드는 ScanCallback를 매개변수로 사용합니다. 이 콜백을 통해 스캔 결과가 반환되므로 반드시 구현해야 합니다. 스캔은 배터리를 많이 사용하므로 다음 가이드라인을 준수해야 합니다.

  • 원하는 기기를 찾는 즉시 스캔을 중단합니다.
  • 절대로 반복해서 스캔하지 말고, 항상 스캔에 시간 제한을 설정하세요. 이전에 사용할 수 있었던 기기가 범위 밖으로 이동했을 수 있으며 계속 스캔하면 배터리가 소모됩니다.

다음 예에서 BLE 앱은 사용 가능한 블루투스 LE 기기를 스캔하고 사용자에게 목록으로 표시하는 활동(DeviceScanActivity)을 제공합니다. 다음 스니펫은 스캔을 시작하고 중지하는 방법을 보여줍니다.

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

특정 유형의 주변기기만 스캔하려면 스캔에서 찾는 기기를 제한하는 ScanFilter 객체 목록과 스캔 관련 매개변수를 지정하는 ScanSettings 객체를 제공하여 startScan(List<ScanFilter>, ScanSettings, ScanCallback)를 대신 호출하면 됩니다.

다음 코드 샘플은 BLE 검색 결과를 전달하는 데 사용되는 인터페이스인 ScanCallback의 구현입니다. 결과가 발견되면 결과가 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();
            }
        };