boolean startScan = mBluetoothAdapter.startLeScan(mScanUUID, mLeScanCallback);
在搜索的时候可以设置需要搜索的uuid数组和设置回调..uuid就是蓝牙服务的uuid...
这个方法会返回当前搜索是否成功, 因为有时候蓝牙已经在搜索状态了,你再次请求搜索会导致失败,还有我们也知道搜索的方法是通过调用低层硬件去搜索广播的数据的,一般情况下我们搜索到设备后就关闭搜索,避免高耗电...搜索关闭后也会返回一个回调提示搜索成功的意思....但是很多时候,这个不能满足我们的需要,,例如:我们需要实时更新附近列表设备,这时候我们常见的做法就是开启搜索,然后数秒后结束搜索,得到结果...这样频繁操作搜索很多时候系统都会提示你说操作太频繁,不允许...实际上,我们在搜索的时候不需要去关闭搜索的..系统低层会一直进行搜索,我们只需要在回调中进行过滤,清空队列...这样就可以实现实时更新的操作.
上面都是废话多,下面直接上一份自己用的代码供参考
/**
* 保存数据是否已保存过
*/
private AtomicBoolean hasFound = new AtomicBoolean(false);
/**
* 搜索结果的回调
*/
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
if (device == null || scanRecord == null)
return;
final BleValueBean mBle = new BleValueBean(device, rssi, scanRecord, System.currentTimeMillis());
boolean isMeBle = true;
// isMeBle = scanRecord[9] == 114 && scanRecord[10] == 1111 && scanRecord[11] == 106;
if (isMeBle) {
synchronized (this) {
// MyLog.i(TAG,"搜索结果的回调:"+device.getAddress());
hasFound.set(false);
for (BleValueBean mBleValueBean : mListBle) {
if (mBleValueBean.equals(mBle)) {
hasFound.set(true);
}
}
if (!hasFound.get()) {
mListBle.add(mBle);
runOnMainThread(new Runnable() {
@Override
public void run() {
if (mCallback != null) {
mCallback.onScanning(mBle.getDevice().getAddress());
}
}
});
}
}
}
}
};
在代码中onScanning回调搜索结果,然后我们再写一个定时器,每秒读取一次mListBle中的数据,读取5~10次后就清空mListBle列表..即可实现发现设备后实时加入到列表中,每个一段时间就更新整个列表的内容.
如果你不习惯或者不熟悉定时器,可以简单的用Handler来实现,在发送的时候延迟1秒发送给自己即可例如:
mHandler.sendEmptyMessageDelayed(STOP_BLE_DEVICE, scanOut);scanOut表示延迟的时间,精确到毫秒
STOP_BLE_DEVICE就是消息的what...自己发送自己接收,在设置一个a变量递增,当a>10的时候就清空列表即可...退出搜索就移除
Handler中的STOP_BLE_DEVICE,并且停止搜索即可...
我们也知道android的系统自带的自动连接有点慢...我们可以在实时更新列表的时候进行判断自己主动去连接来实现自动连接的功能,,这样我们就可以精确到大概1~2就可以连接设备....系统的自动连接有时候需要10几秒....可能主要是为了省电的原因...