在我的应用程序中,我希望一个看门狗经常醒来,检查我们是否连接到设备。我还希望用户现在可以按一个按钮进行连接。检查我们是否已经连接,并且驳回请求就足够简单了。但是,如果当前扫描正在进行,我也不想启动扫描。所以我有一个方法可以像这样启动扫描:
void scanLeDevice(final boolean enable) {
if (enable) {
//Will stop the scanner in given amount of milliseconds
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mLEScanner.stopScan(mScanCallback);
}
}, SCAN_PERIOD);
mLEScanner.startScan(filters, settings, mScanCallback);
isScanning = true;
Log.i("BLE_Service_Comm", "Scanning...");
} else {
mLEScanner.stopScan(mScanCallback);
Log.i("BLE_Service_Comm", "Scanning stopped");
}
}
请注意,我将“Isscanning”设置为“true”。如果我收到任何类型的回调,我会确保“Isscanning”为假:
private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
isScanning = false;
Log.i("BLE_Service_Comm", "Scan callback type " + String.valueOf(callbackType));
Log.i("BLE_Service_Comm", "Scan callback " + result.toString());
BluetoothDevice btDevice = result.getDevice();
Log.i("BLE_Service_Comm", "Scan callback address " + btDevice.getAddress());
connectToDevice(btDevice);
}
//Honestly don't know when it would return a "batch" like this
@Override
public void onBatchScanResults(List<ScanResult> results) {
isScanning = false;
Log.i("BLE_Service_Comm", "Batch results");
for (ScanResult sr : results) {
Log.i("BLE_Service_Comm", sr.toString());
}
}
@Override
public void onScanFailed(int errorCode) {
isScanning = false;
Log.e("BLE_Service_Comm", "Scan failed with Error Code: " + errorCode);
}
};
一旦我连接,我就可以找到我想要的关贸总协定概况,一切都很好。当我的自动定时器唤醒,或用户按下“连接”按钮,设备已连接或“正在扫描”为真时,它会忽略该请求。
但是如果我的扫描
不
找到一个设备,mscancallback永远不会运行,“isscanning”永远保持不变。在这种情况下,计时器醒了,或者用户按“connect”不会做任何事情,因为我会看到“isscanning”是真的。
我是不是错过了什么?有没有一种方法可以让scanCallback告诉您扫描已完成,但未找到任何内容?我的延迟运行方法是否可以在扫描结束后结束扫描?时间段有什么问题吗?