我有一个扫描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);
}
}
};
答案 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()
也不会停止扫描。