BluetoothAdapter 不会停止扫描 BLE 设备
BluetoothAdapter won't stop scanning for BLE devices
在我的应用程序中,我有开始和停止按钮,当用户按下开始时我调用 startScan 方法
bluetoothAdapter.getBluetoothLeScanner().startScan(getLeScanCallback());
当用户按下停止键时,我会调用 stopScan,但它似乎什么也没做。 BluetoothAdapter 不断扫描新设备。
bluetoothAdapter.getBluetoothLeScanner().stopScan(getLeScanCallback());
这是我的 getLeScanCallback 方法:
private ScanCallback getLeScanCallback(){
ScanCallback leScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
boolean duplicate = false;
for(Device d : devices) {
if(d.getAddress().equals(result.getDevice().getAddress()))
duplicate = true;
}
if(!duplicate) {
Device device = new Device();
device.setName(result.getDevice().getName());
device.setAddress(result.getDevice().getAddress());
device.setStatus(getString(R.string.disconnected));
devices.add(device);
deviceListAdapter.notifyDataSetChanged();
}
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
}
};
return leScanCallback;
}
即使在调用 stopScan() 之后也会调用它。我做错了什么或者换句话说,如何停止扫描 BLE 设备?
替换
bluetoothAdapter.getBluetoothLeScanner().startScan(getLeScanCallback());
bluetoothAdapter.getBluetoothLeScanner().stopScan(getLeScanCallback());
和
bluetoothAdapter.getBluetoothLeScanner().startLeScan(getLeScanCallback());
bluetoothAdapter.getBluetoothLeScanner().stopLeScan(getLeScanCallback());
我没有注意到您的代码有任何问题,看起来没问题。也许您的 getLeScanCallback()
方法有问题?
你可以将它声明为一个成员变量,而不是使用 return 你的 ScanCallback 的方法,这样你就可以拥有 leScanCallback = new ScanCallback()
然后你可以在尝试时只引用这个成员变量停止扫描。
bluetoothAdapter.getBluetoothLeScanner().stopScan(leScanCallback);
根据您支持的 Android 版本,添加 startLeScan
和 stopLeScan
方法可能是值得的,Rajesh Panchal 建议为 pre Lollipop Android设备。
每次调用 getLeScanCallback
都会创建 ScanCallback
的新实例并丢失对先前实例的引用。
stopScan
停止正在进行的扫描,无论您传递什么实例,但如果它是一个不同的实例(与您用来启动的实例不同),它不会删除旧的回调实例,因此仍然会有一些事件被传送到在它停止之前。
扫描结果不会立即停止,但最终会停止。有一个待处理结果队列,您可以使用它们刷新:
scanner.flushPendingScanResults();
但即便如此,文档也清楚地表明它会将找到的任何内容发送给回调。即使您已停止扫描,也会发生这种情况。糟糕的 API 设计,但它就是这样。
我认为最简单的方法是设置一个标志以在停止扫描结果后忽略它们。
在我的应用程序中,我有开始和停止按钮,当用户按下开始时我调用 startScan 方法
bluetoothAdapter.getBluetoothLeScanner().startScan(getLeScanCallback());
当用户按下停止键时,我会调用 stopScan,但它似乎什么也没做。 BluetoothAdapter 不断扫描新设备。
bluetoothAdapter.getBluetoothLeScanner().stopScan(getLeScanCallback());
这是我的 getLeScanCallback 方法:
private ScanCallback getLeScanCallback(){
ScanCallback leScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
boolean duplicate = false;
for(Device d : devices) {
if(d.getAddress().equals(result.getDevice().getAddress()))
duplicate = true;
}
if(!duplicate) {
Device device = new Device();
device.setName(result.getDevice().getName());
device.setAddress(result.getDevice().getAddress());
device.setStatus(getString(R.string.disconnected));
devices.add(device);
deviceListAdapter.notifyDataSetChanged();
}
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
}
};
return leScanCallback;
}
即使在调用 stopScan() 之后也会调用它。我做错了什么或者换句话说,如何停止扫描 BLE 设备?
替换
bluetoothAdapter.getBluetoothLeScanner().startScan(getLeScanCallback());
bluetoothAdapter.getBluetoothLeScanner().stopScan(getLeScanCallback());
和
bluetoothAdapter.getBluetoothLeScanner().startLeScan(getLeScanCallback());
bluetoothAdapter.getBluetoothLeScanner().stopLeScan(getLeScanCallback());
我没有注意到您的代码有任何问题,看起来没问题。也许您的 getLeScanCallback()
方法有问题?
你可以将它声明为一个成员变量,而不是使用 return 你的 ScanCallback 的方法,这样你就可以拥有 leScanCallback = new ScanCallback()
然后你可以在尝试时只引用这个成员变量停止扫描。
bluetoothAdapter.getBluetoothLeScanner().stopScan(leScanCallback);
根据您支持的 Android 版本,添加 startLeScan
和 stopLeScan
方法可能是值得的,Rajesh Panchal 建议为 pre Lollipop Android设备。
每次调用 getLeScanCallback
都会创建 ScanCallback
的新实例并丢失对先前实例的引用。
stopScan
停止正在进行的扫描,无论您传递什么实例,但如果它是一个不同的实例(与您用来启动的实例不同),它不会删除旧的回调实例,因此仍然会有一些事件被传送到在它停止之前。
扫描结果不会立即停止,但最终会停止。有一个待处理结果队列,您可以使用它们刷新:
scanner.flushPendingScanResults();
但即便如此,文档也清楚地表明它会将找到的任何内容发送给回调。即使您已停止扫描,也会发生这种情况。糟糕的 API 设计,但它就是这样。
我认为最简单的方法是设置一个标志以在停止扫描结果后忽略它们。