赞
踩
在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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。