蓝牙开发:Android 8.1及以上系统后台模式无法开启扫描问题

版权声明:欢迎转载,转载请注明出处!谢谢! https://blog.csdn.net/sxk874890728/article/details/90169383

在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

猜你喜欢

转载自blog.csdn.net/sxk874890728/article/details/90169383
今日推荐