最近公司应用要接入蓝牙,所以这两天在自己熟悉蓝牙这块的东西。
碰到一个问题是在调用 stopLeScan时 蓝牙依然在扫描,后来发现原因是需要在startLeScan 和stopLeScan 使用同一个对象Callback。
看来,在调用stopLeScan时 系统根据传入的Callback确定要停止的蓝牙扫描。若有说的不对的地方,请大神门指出哈。
查看了下 BluetoothAdapter的源码 stopLeScan方法如下(注意加红加粗的)
public void stopLeScan(LeScanCallback callback) {
if (DBG) Log.d(TAG, "stopLeScan()");
BluetoothLeScanner scanner = getBluetoothLeScanner();
if (scanner == null) {
return;
}
synchronized (mLeScanClients) {
ScanCallback scanCallback = mLeScanClients.remove(callback);
if (scanCallback == null) {
if (DBG) Log.d(TAG, "scan not started yet");
return;
}
scanner.stopScan(scanCallback);
}
}
正确的:(使用同一个Callback)
private void startOrStopSearchBLE(boolean search) {
if (search) {
mBluetoothAdapter.startLeScan(scanCallback);
} else {
mBluetoothAdapter.stopLeScan(scanCallback);
}
}
private BluetoothAdapter.LeScanCallback scanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
String struuid = bytes2HexString(scanRecord).replace("-", "").toLowerCase();
Log.i("搜索蓝牙设备信息", "device=" + device.getName() + ";rssi=" + rssi + ";scanRecord=" + struuid);
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
}
};
错误的:(每次new了一个新的Callback)
private void startOrStopSearchBLE(boolean search) {
if (search) {
mBluetoothAdapter.startLeScan(new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
}
});
} else {
mBluetoothAdapter.stopLeScan(new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
}
});
}
}