Ashwin Prasad
Ashwin Prasad

Reputation: 128

Android BLE setReportDelay()

I'm trying to implement a BLE scan app where i want to list all the devices nearby in a single scan rather than getting one BLE device at a time.

I read from the Android Documentation that i can use setReportDelay() in the Scan Setting Builder to delay the scan results and to use the BatchScanResults() to get a batch/list of devices found.

However when i try to use the setReportDelay() in the Scan Settings builder the scan does not start at all and i get the following error.

04-13 16:03:19.887    8454-8454/com.example.sasnee_lab2.sasbeacon D/BluetoothLeScanner﹕ could not find callback wrapper

Here is my StartScan function with Scan Settings

public void startScan(BluetoothLeScanner scanner)
{
    ScanFilter filter = new ScanFilter.Builder().setDeviceName(null).build();

    ArrayList<ScanFilter> filters = new ArrayList<ScanFilter>();
                    filters.add(filter);

    ScanSettings settings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).setReportDelay(1l)
                                .build();

    Log.i(TAG,"The setting are "+settings.getReportDelayMillis());
    scanner.startScan(filters,settings,BLEScan);


}

And here is the Scan Callback.

  private ScanCallback BLEScan = new ScanCallback() {

        @Override
        public void onBatchScanResults(List<ScanResult> results) {

            Log.i(TAG,"The batch result is "+results.size());
        }

        @Override
        public void onScanResult(int callbackType, ScanResult result) {

            Log.i(TAG,"******************************************");
            Log.i(TAG,"The scan result "+result);
            Log.i(TAG,"------------------------------------------");
        }


        @Override
        public void onScanFailed(int errorCode) {
            super.onScanFailed(errorCode);
        }


        }


    };

Please let me know if i'm doing anything wrong in the implementation here. And thank you.

Upvotes: 4

Views: 3691

Answers (2)

Giuseppe Criscione
Giuseppe Criscione

Reputation: 449

Use this:

Java

boolean f = adapter.isOffloadedScanBatchingSupported();
if (!f) builder.setReportDelay(0) else builder.setReportDelay(1)

Kotlin

val f: Boolean = adapter.isOffloadedScanBatchingSupported
if (!f) builder.setReportDelay(0) else builder.setReportDelay(1)

Upvotes: 3

Doug Koellmer
Doug Koellmer

Reputation: 427

You must check whether your hardware supports scan batching through BluetoothAdapter.isOffloadedScanBatchingSupported(). If this returns false then you should not attempt to set a report delay.

Upvotes: 3

Related Questions