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】:这就是我解决问题的方法
-
使用“前台服务”
-
授予“始终允许”权限
【讨论】:
【参考方案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 后台订阅仅适用于事件屏幕