Android BLE LeScanCallback在停止时获取

时间:2017-03-29 17:53:20

标签: android bluetooth bluetooth-lowenergy

我有一个扫描BLE设备10秒钟的对话框。当我开始扫描时,我在列表的页脚中启用了一个微调器。扫描完成后,我想删除该微调器。我尝试使用已弃用的mBluetoothAdapter.stopLeScan(回调)函数而不是新的startScan / stopScan函数,就像设备未运行21或更高版本一样,你必须回退到这个方法。

stopLeScan需要与startLeScan相同的回调,但我不认为我看到了回调。我希望这是一个简单的检查,看看BluetoohDevice是否为null,然后回调是因为扫描被停止,但这没有用。

使用旧版本的SDK,如何在扫描停止时(由于找到正确的设备或扫描时间完成)如何获得?我可以将另一个处理程序传递给我的scanLeDevice函数,但这似乎很愚蠢,因为我已经通过了一个回调。

蓝牙扫描程序

public class BleDevice {
    private final static String TAG = BleDevice.class.getSimpleName();

    // Stops scanning after 10 seconds.
    private static final long SCAN_PERIOD = 10000;

    private BluetoothAdapter mBluetoothAdapter;
    private boolean mScanning;
    private Handler mHandler;

    public BleDevice() {
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        mHandler = new Handler();
    }

    public void scanLeDevice(final boolean enable, final BluetoothAdapter.LeScanCallback callback) {
        if (enable == true && mScanning == false) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    // Turn off scanning
                    scanLeDevice(false, callback);
                }
            }, SCAN_PERIOD);

            mScanning = true;
            mBluetoothAdapter.startLeScan(callback);
            Log.d(TAG, "Starting Bluetooth LE scan");
        } else if(enable == false && mScanning == true) {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(callback);
            Log.d(TAG, "Stopped Bluetooth LE scan");
        }
    }
}

对话框中的回调:

private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
    @Override
    public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
        Log.d(TAG, device.getAddress() + " " + device.getName() + "");
        if(device == null) {
            Log.d(TAG, "Device is null? stop?");
        } else {
            btAdapter.add(device);
        }
    }
};

1 个答案:

答案 0 :(得分:0)

mBluetoothAdapter.stopLeScan(callback);callback仅用于识别要停止的扫描,并且它不应该触发callback中的任何方法。这是一个同步操作。

并且BluetoothAdapter.LeScanCallback班级甚至没有任何方法可以获得刚刚收到结果的onLeScan()

因此,您可以定义自己的方法,以便在您停止扫描时触发:

...
} else if(enable == false && mScanning == true) {
    mScanning = false;
    mBluetoothAdapter.stopLeScan(callback);
    Log.d(TAG, "Stopped Bluetooth LE scan");
    onScanStopped(); // <--- Remove the spinner here. 
}

我不知道startLeScan()的任何自动超时,因此据我所知,它只能通过调用stopLeScan()来停止。触发onLeScan()也不会停止扫描。