Android BLE 扫描屏幕关闭(使用 Galaxy)

Posted

技术标签:

【中文标题】Android BLE 扫描屏幕关闭(使用 Galaxy)【英文标题】:Android BLE scan with screen off (with Galaxy) 【发布时间】:2020-08-06 12:11:35 【问题描述】:

我正在使用 Galaxy S10,android 10。来自here,三星设备的 BLE 扫描需要非空扫描过滤器才能在屏幕关闭状态下进行扫描。

下面是我的 AdvertiseData 和 ScanFilter 代码。

ParcelUuid aaUuid = ParcelUuid.fromString("0000aa11-0000-1000-8000-00805F9B34FB");

AdvertiseData advertiseData = new AdvertiseData.Builder()
                .setIncludeDeviceName(true) 
                .addServiceUuid(aaUuid)
                .build();

ScanFilter scanFilter = new ScanFilter.Builder()
                .setServiceUuid(aaUuid)
                .build();

在屏幕开启的情况下,它运行良好。但是,关闭屏幕时,它也不起作用。

我设置了 10 次扫描来检查这一点。起初,屏幕打开,它工作得很好。当它变成屏幕关闭时,第一次扫描效果很好。但是没有出现下一个扫描结果,它只是开始下一个扫描过程(没有结果)。

每次扫描重复的“WakeLock”都会产生相同的结果。如何解决这个问题?


添加 1. 我使用 WorkManager 来处理后台进程。然后我在寻找另一种方法。

添加2。下面是我的scancallback代码。

private ScanCallback mScanCallback = new ScanCallback() 
        @Override
        public void onScanResult(int callbackType, ScanResult result) 
            super.onScanResult(callbackType, result);
            if (result.getDevice().getName() != null)
                setBleScanResult(result);
        

        @Override
        public void onBatchScanResults(List<ScanResult> results) 
            super.onBatchScanResults(results);
        

        @Override
        public void onScanFailed(int errorCode) 
            super.onScanFailed(errorCode);
            Log.d("LOG_BLESCANNING_onScanFailed", "Error Code : " + errorCode);
        
    ;

添加 3. 下面是我关闭屏幕时的日志

...
D/Worker: ============ Bluetooth Scanning start ============
D/LOG_BluetoothScan: Bluetooth scanning started successfully
D/BluetoothAdapter: isLeEnabled(): ON
D/BluetoothLeScanner: onScannerRegistered() - status=0 scannerId=4 mScannerId=0
D/BluetoothAdapter: isLeEnabled(): ON
D/LOG_BluetoothScan: Bluetooth scanning stopped
...

屏幕开启

D/Worker: ============ Bluetooth Scanning start ============
D/LOG_BluetoothScan: Bluetooth scanning started successfully
D/BluetoothAdapter: isLeEnabled(): ON
D/BluetoothLeScanner: onScannerRegistered() - status=0 scannerId=4 mScannerId=0
D/LOG_BluetoothScan: W S10 | [00001111-0000-1000-8000-00805f9b34fb] | 55:40:DE:86:D0:03
D/LOG_BluetoothScan: W S10 | [00001111-0000-1000-8000-00805f9b34fb] | 55:40:DE:86:D0:03
D/LOG_BluetoothScan: W S10 | [00001111-0000-1000-8000-00805f9b34fb] | 55:40:DE:86:D0:03
D/LOG_BluetoothScan: W S10 | [00001111-0000-1000-8000-00805f9b34fb] | 55:40:DE:86:D0:03
D/BluetoothAdapter: isLeEnabled(): ON
D/LOG_BluetoothScan: Bluetooth scanning stopped

添加 4. 我很好奇“为什么这个问题只出现在 ble 扫描中?”我检查了屏幕关闭状态下的ble广告没有任何问题。


补充 5. 广告也有问题……但不是必须的。我认为 MainActivity - Worker(来自 WorkManager)连接不好控制这种情况。

【问题讨论】:

可能是您的过滤器无效,尝试将设备名称设置为过滤器并扫描此类设备。而且即使您的过滤器不正确,当您的屏幕打开时扫描也会起作用! 你解决了这个问题吗? 【参考方案1】:

这就是我解决问题的方法

    使用“前台服务”
我没有检查 workmanager 是否可用,但 ForegroundService 运行良好。我使用 timer 和 timertask 在前台重复这个过程。
    授予“始终允许”权限
这是主要问题。打盹模式不允许我的应用使用 GPS。所以我打开 GPS 设置,将我的应用的权限从使用应用时的允许设置为一直允许。

【讨论】:

【参考方案2】:

这是我的工作代码 - 甚至设备屏幕都被锁定了。

更新:

感谢您提到您使用了 "WorkerManager"。之后只在我脑海中闪过。从 android 8 开始,google 引入了 Doze 模式等电池优化。因此,它不允许服务在睡眠(打盹模式)期间在后台运行。因此,您可以进行 BLE 扫描 **

使用“前台服务”

** 代替 Worker 或 Jobscheduler 等。

请查看此链接: https://developer.android.com/training/monitoring-device-state/doze-standby

两年前,我也在这个阶段挣扎。切换到“Forgreound Service”后它正在工作

OLD(关于初始化 - BLE 扫描) 请检查您的代码。这很简单。等待您的回复。

1.初始化扫描过滤器

    btLeScanFilters = new ArrayList<ScanFilter>();
    ScanFilter scanFilter = new ScanFilter.Builder()
            .setServiceUuid(new ParcelUuid("........ uuid reference ......"))
            .build();
    btLeScanFilters.add(scanFilter);

2。初始化扫描设置

    btLeScanSettings = new ScanSettings.Builder().

setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();

3.初始化扫描回调

   private ScanCallback leScanCallback = new ScanCallback() 

    @Override
    public void onScanResult(int callbackType,
                             final ScanResult result)

        new TPMSAsyncTask().execute(result);
    
   

4.开始扫描

    btLeScanner.startScan(btLeScanFilters, 
               btLeScanSettings,
               leScanCallback);
        
   

【讨论】:

唯一不同的部分是过滤器初始化。我在列表中初始化过滤器并尝试相同的过程,但结果没有改变。谢谢你的帮助。 请在设备屏幕锁定时分享您的日志。请跟踪您的扫描回调。它存在于活动或服务中??如果它在活动中,还要查看活动的 onpause 方法。 我添加了我的代码和日志,但我没有在 onPause() 方法中设置任何代码。 我试过了,但还是一样:(我猜当屏幕关闭时,GPS也会关闭。 非常感谢,我通过 ForegroundService 解决了这个问题,只是将权限从“仅在使用时允许”更改为“一直允许”。这是一个非常简单的问题

以上是关于Android BLE 扫描屏幕关闭(使用 Galaxy)的主要内容,如果未能解决你的问题,请参考以下文章

Google nearBy BLE 后台订阅仅适用于事件屏幕

BLE 扫描在 Android 中不起作用

Android代码不扫描BLE设备CC2650

Android BLE扫描模式设置间隔

BLE 5 外围设备未在支持 BLE 5 的 Android 手机和 iPhone 上得到扫描

Android 4.4:低功耗蓝牙;无需扫描 BLE 设备即可连接