当前位置:   article > 正文

蓝牙开发:Android 8.1及以上系统后台模式无法开启扫描问题_android 程序处于后台扫描不到蓝牙

android 程序处于后台扫描不到蓝牙

在Android 8.1 及以上系统中,正常状况下扫描蓝牙没有问题,但是当App处于后台时,无法开启扫描方法并有如下提示

        BtGatt.ScanManager: Cannot start unfiltered scan in screen-off. This scan will be resumed later: 9

这是因为你开启的扫描扫描方法是没有设置扫描过滤器的问题,在Android 8.1及以上系统中在后台模式中开启扫描必须要关联扫描过滤器,如此才能在后台模式下完美运行

  1. //设置蓝牙扫描过滤器集合
  2. private List<ScanFilter> scanFilterList;
  3. //设置蓝牙扫描过滤器
  4. private ScanFilter.Builder scanFilterBuilder;
  5. //设置蓝牙扫描设置
  6. private ScanSettings.Builder scanSettingBuilder;
  7. private List<ScanFilter> buildScanFilters() {
  8. scanFilterList = new ArrayList<>();
  9. // 通过服务 uuid 过滤自己要连接的设备 过滤器搜索GATT服务UUID
  10. scanFilterBuilder = new ScanFilter.Builder();
  11. ParcelUuid parcelUuidMask = ParcelUuid.fromString("FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF");
  12. ParcelUuid parcelUuid = ParcelUuid.fromString("0000ff07-0000-1000-8000-00805f9b34fb");
  13. scanFilterBuilder.setServiceUuid(parcelUuid, parcelUuidMask);
  14. scanFilterList.add(scanFilterBuilder.build());
  15. return scanFilterList;
  16. }
  17. private ScanSettings buildScanSettings() {
  18. scanSettingBuilder = new ScanSettings.Builder();
  19. //设置蓝牙LE扫描的扫描模式。
  20. //使用最高占空比进行扫描。建议只在应用程序处于此模式时使用此模式在前台运行
  21. scanSettingBuilder.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY);
  22. //设置蓝牙LE扫描滤波器硬件匹配的匹配模式
  23. //在主动模式下,即使信号强度较弱,hw也会更快地确定匹配.在一段时间内很少有目击/匹配。
  24. scanSettingBuilder.setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE);
  25. //设置蓝牙LE扫描的回调类型
  26. //为每一个匹配过滤条件的蓝牙广告触发一个回调。如果没有过滤器是活动的,所有的广告包被报告
  27. scanSettingBuilder.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES);
  28. return scanSettingBuilder.build();
  29. }
  30. //调用开启扫描方法
  31. mBluetoothAdapter.getBluetoothLeScanner().startScan(buildScanFilters(), buildScanSettings(), mLeScanCallback);

说白了,就是设置ScanFilters以及ScanSettings

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号