在Android 8.1 及以上系统中,正常状况下扫描蓝牙没有问题,但是当App处于后台时,无法开启扫描方法并有如下提示
BtGatt.ScanManager: Cannot start unfiltered scan in screen-off. This scan will be resumed later: 9
这是因为你开启的扫描扫描方法是没有设置扫描过滤器的问题,在Android 8.1及以上系统中在后台模式中开启扫描必须要关联扫描过滤器,如此才能在后台模式下完美运行
//设置蓝牙扫描过滤器集合
private List<ScanFilter> scanFilterList;
//设置蓝牙扫描过滤器
private ScanFilter.Builder scanFilterBuilder;
//设置蓝牙扫描设置
private ScanSettings.Builder scanSettingBuilder;
private List<ScanFilter> buildScanFilters() {
scanFilterList = new ArrayList<>();
// 通过服务 uuid 过滤自己要连接的设备 过滤器搜索GATT服务UUID
scanFilterBuilder = new ScanFilter.Builder();
ParcelUuid parcelUuidMask = ParcelUuid.fromString("FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF");
ParcelUuid parcelUuid = ParcelUuid.fromString("0000ff07-0000-1000-8000-00805f9b34fb");
scanFilterBuilder.setServiceUuid(parcelUuid, parcelUuidMask);
scanFilterList.add(scanFilterBuilder.build());
return scanFilterList;
}
private ScanSettings buildScanSettings() {
scanSettingBuilder = new ScanSettings.Builder();
//设置蓝牙LE扫描的扫描模式。
//使用最高占空比进行扫描。建议只在应用程序处于此模式时使用此模式在前台运行
scanSettingBuilder.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY);
//设置蓝牙LE扫描滤波器硬件匹配的匹配模式
//在主动模式下,即使信号强度较弱,hw也会更快地确定匹配.在一段时间内很少有目击/匹配。
scanSettingBuilder.setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE);
//设置蓝牙LE扫描的回调类型
//为每一个匹配过滤条件的蓝牙广告触发一个回调。如果没有过滤器是活动的,所有的广告包被报告
scanSettingBuilder.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES);
return scanSettingBuilder.build();
}
//调用开启扫描方法
mBluetoothAdapter.getBluetoothLeScanner().startScan(buildScanFilters(), buildScanSettings(), mLeScanCallback);
说白了,就是设置ScanFilters以及ScanSettings