前景:在开发一个ble蓝牙的项目时,碰到一个需求,就是在按下硬件设备的某一个按钮的时候,App要主动去连接硬件,当时的设计是,硬件按下按钮时,改一个特殊的名字,App一直不停的搜索,直到搜索到特殊的名字,就主动去连接
问题:如果硬件先按下按钮改变名字,再打开App,那么基本上秒连;但是如果先打开App,过一会儿再按设备按钮,那么有时要搜索好久
2021-01-30 14:30:33.461 8661-8838/com.test.ble D/BluetoothLeScanner: onScannerRegistered() - status=0 scannerId=8 mScannerId=0
2021-01-30 14:30:33.468 8661-8661/com.test.ble D/HZH: onScanStarted: start
2021-01-30 14:30:33.601 8661-8661/com.test.ble D/HZH: onScanning: scanning
2021-01-30 14:30:33.906 8661-8661/com.test.ble I/chatty: uid=10176(com.test.ble) identical 18 lines
2021-01-30 14:30:35.977 8661-8661/com.test.ble D/HZH: onScanning: scanning
2021-01-30 14:30:36.286 8661-8661/com.test.ble D/HZH: onScanning: scanning
2021-01-30 14:30:36.536 8661-8661/com.test.ble D/HZH: onScanFinished: null
2021-01-30 14:30:36.538 8661-8661/com.test.ble D/HZH: onScanFinished: null
2021-01-30 14:30:36.540 8661-8661/com.test.ble D/HZH: onScanFinished: Mi Smart Band 4
2021-01-30 14:30:36.541 8661-8661/com.test.ble D/HZH: onScanFinished: not found
2021-01-30 14:30:36.543 8661-8661/com.test.ble D/BluetoothAdapter: startLeScan(): null
2021-01-30 14:30:36.543 8661-8661/com.test.ble D/BluetoothAdapter: isLeEnabled(): ON
2021-01-30 14:30:36.546 8661-8838/com.test.ble D/BluetoothLeScanner: onScannerRegistered() - status=0 scannerId=8 mScannerId=0
2021-01-30 14:30:36.553 8661-8661/com.test.ble D/HZH: onScanStarted: start
2021-01-30 14:30:36.681 8661-8661/com.test.ble D/HZH: onScanning: scanning
2021-01-30 14:30:39.609 8661-8661/com.test.ble D/HZH: onScanFinished: MI_SCALE
2021-01-30 14:30:39.611 8661-8661/com.test.ble D/HZH: onScanFinished: null
2021-01-30 14:30:39.619 8661-8661/com.test.ble I/chatty: uid=10176(com.test.ble) identical 6 lines
2021-01-30 14:30:39.621 8661-8661/com.test.ble D/HZH: onScanFinished: null
2021-01-30 14:30:39.622 8661-8661/com.test.ble D/HZH: onScanFinished: Mi Smart Band 4
2021-01-30 14:30:39.624 8661-8661/com.test.ble D/HZH: onScanFinished: null
2021-01-30 14:30:39.625 8661-8661/com.test.ble D/HZH: onScanFinished: not found
2021-01-30 14:30:39.627 8661-8661/com.test.ble D/BluetoothAdapter: startLeScan(): null
2021-01-30 14:30:39.628 8661-8661/com.test.ble D/BluetoothAdapter: isLeEnabled(): ON
2021-01-30 14:30:39.629 8661-8777/com.test.ble D/BluetoothLeScanner: onScannerRegistered() - status=6 scannerId=-1 mScannerId=0
2021-01-30 14:30:39.639 8661-8661/com.test.ble D/HZH: onScanStarted: start
2021-01-30 14:30:39.940 8661-8661/com.test.ble D/HZH: onScanStarted: scan error true
2021-01-30 14:30:39.940 8661-8661/com.test.ble D/BluetoothAdapter: isLeEnabled(): ON
2021-01-30 14:30:39.942 8661-8777/com.test.ble D/BluetoothLeScanner: onScannerRegistered() - status=6 scannerId=-1 mScannerId=0
2021-01-30 14:30:42.632 8661-8661/com.test.ble D/BluetoothAdapter: stopLeScan()
2021-01-30 14:30:42.633 8661-8661/com.test.ble D/BluetoothAdapter: isLeEnabled(): ON
2021-01-30 14:30:42.633 8661-8661/com.test.ble D/BluetoothLeScanner: could not find callback wrapper
2021-01-30 14:30:42.633 8661-8661/com.test.ble D/HZH: onScanFinished: not found
2021-01-30 14:30:42.635 8661-8661/com.test.ble D/BluetoothAdapter: startLeScan(): null
2021-01-30 14:30:42.636 8661-8661/com.test.ble D/BluetoothAdapter: isLeEnabled(): ON
2021-01-30 14:30:42.638 8661-8777/com.test.ble D/BluetoothLeScanner: onScannerRegistered() - status=6 scannerId=-1 mScannerId=0
2021-01-30 14:30:42.643 8661-8661/com.test.ble D/HZH: onScanStarted: start
2021-01-30 14:30:42.944 8661-8661/com.test.ble D/HZH: onScanStarted: scan error true
2021-01-30 14:30:42.944 8661-8661/com.test.ble D/BluetoothAdapter: isLeEnabled(): ON
2021-01-30 14:30:42.947 8661-8777/com.test.ble D/BluetoothLeScanner: onScannerRegistered() - status=6 scannerId=-1 mScannerId=0
起初发现返回的列表一直为null,以为是确实没搜到,后面突然间发现,当返回null的时候,onScanning方法根本没有回调,这就奇怪了,这就完全不是没搜到的问题了,而是根本没去搜索!
这是为何,本着看看的态度,就看了一看log
正常的时候
D/BluetoothLeScanner: onScannerRegistered() - status=0 scannerId=8 mScannerId=0
异常的时候
D/BluetoothLeScanner: onScannerRegistered() - status=6 scannerId=-1 mScannerId=0
状态不对啊,id也不对,这是什么鬼?于是就追溯到了源码
D:\Sdk\sources\android-30\android\bluetooth\le\BluetoothLeScanner.java
/**
* Application interface registered - app is ready to go
*/
@Override
public void onScannerRegistered(int status, int scannerId) {
Log.d(TAG, "onScannerRegistered() - status=" + status
+ " scannerId=" + scannerId + " mScannerId=" + mScannerId);
synchronized (this) {
if (status == BluetoothGatt.GATT_SUCCESS) {
try {
if (mScannerId == -1) {
// Registration succeeds after timeout, unregister scanner.
mBluetoothGatt.unregisterScanner(scannerId);
} else {
mScannerId = scannerId;
mBluetoothGatt.startScan(mScannerId, mSettings, mFilters,
mResultStorages, mOpPackageName, mFeatureId);
}
} catch (RemoteException e) {
Log.e(TAG, "fail to start le scan: " + e);
mScannerId = -1;
}
} else if (status == ScanCallback.SCAN_FAILED_SCANNING_TOO_FREQUENTLY) {
// applicaiton was scanning too frequently
mScannerId = -2;
} else {
// registration failed
mScannerId = -1;
}
notifyAll();
}
}
D:\Sdk\sources\android-30\android\bluetooth\le\ScanCallback.java
/**
* Fails to start scan as application tries to scan too frequently.
* @hide
*/
public static final int SCAN_FAILED_SCANNING_TOO_FREQUENTLY = 6;
原因一目了然了,系统说了,你小子搜索这么快,想累死我吗?我不搜了!
知道了吧,不要太快了,不然人家会受不了的!