目录
一、前言:
了解点蓝牙开发的童鞋都知道,在进行蓝牙设备的扫描之前需要开启蓝牙。不了解的童鞋可以阅读上一篇文章:蓝牙开发之开启蓝牙。成功开启设备蓝牙功能之后,我们需要拿到周围蓝牙设备信息,这就需要使用到扫描功能。
二、开启蓝牙扫描:
1.获取BluetoothAdapter(蓝牙适配器)
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
2.获取BluetoothLeScanner(蓝牙扫描器)
熟悉蓝牙的童鞋应该知道,在Android 4.3(API 18)时,增加了使用BluetoothAdapter扫描低功耗蓝牙的扫描方法bluetoothAdapter.startLeScan()但是在Android 5.0(API 21)之后就废弃了,并提倡我们使用BluetoothLeScanner#startScan(List, ScanSettings, ScanCallback)替代,在废弃的方法里可以指定蓝牙低功耗蓝牙的UUID去指定要去扫描的设备,同时在回调方法里获取蓝牙设备信息。总之使用蓝牙扫描器扫描低功耗蓝牙设备的优点是不言而喻的,所以这里大家应该有个取舍,或者兼容到Android 4.3,不过我认为没有必要的,并且该版本设备占有率也不高。
言归正传,我们首先获取蓝牙扫描器对象:
if (bluetoothAdapter != null) {
bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();
}
3.添加权限:
上一步骤中我们已经说过,我们推荐使用BLuetoothLeScanner进行低功耗蓝牙的扫描,但是使用该方法进行扫描需要模糊定位权限,所以需要在注册清单中添加:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
4.开始扫描:
使用蓝牙扫描器对象调用开始扫描方法进行扫描:
bluetoothLeScanner.startScan(filters, settings, callback)
说一下三个参数的含义:
- List<ScanFilter> filters:蓝牙扫描的过滤条件,是一个ScanFilter集合,如果没有过滤条件的话可以填null;
- ScanSettings settings:扫描配置,可以不进行任何设置,也就是new ScanSettings.Builder().build()传递一个空对象;
- ScanCallback callback:扫描回调,用于接收扫描回调的结果和扫描失败的回调;
注意:使用该方法扫描低功耗蓝牙设备需要满足Android系统版本在Build.VERSION_CODES.LOLLIPOP以上。
5.扫描参数解析:
(1)ScanFilter:扫描过滤条件。
官方API提供了多种方法添加过滤条件:
关于过滤条件这儿,我也尝试过多次,有些过滤条件不太好使,大家有其他想法,希望能够指正。
- 使用ScanFilter在扫描前将扫描规则加入,得到即为符合规则的设备信息;
- 使用设备名进行过滤,区分大小写;
- 使用设备Mac地址进行过滤,需严格按照原则进行;
- 使用ServiceUuid进行过滤无效(初步原因判断为:扫描得到的uuid集合为空);
- 使用ServiceData进行过滤需要ServiceUuid配合ServiceData进行使用,同时配置的ServiceData为完整数据中的不可变部分;
- 蓝牙的ServiceUuid只有四位可以修改:"0000****-0000-1000-8000-00805F9B34FB";
- 数据均为16进制字符串转化的Byte数组;
注意:使用该方法进行过滤有些方式不太好使;
2.不添加过滤规则,扫描完成后代码过滤;
(2)ScanSettings :参数扫描配置类
官方API提供了多个方法:
一般我们只使用setScanMode()方法就可以,其他参数使用默认值。
该方法有三种取值:
- SCAN_MODE_LOW_POWER:低功耗模式,默认的扫描模式,当应用不在前台时默认执行。
- SCAN_MODE_BALANCED:平衡模式
- SCAN_MODE_LOW_LATENCY:高频模式,前台时建议使用此模式。
6.扫描结果
我们在开始扫描的时候使用了ScanCallback,在onScanResult(int callbackType, ScanResult result)方法里处理回调扫描到的设备信息;如果扫描失败会回调该方法onScanFailed(int errorCode)。