Android 屏幕关闭时的 BLE 扫描(使用 Galaxy)
Android BLE scan with screen off (with Galaxy)
我正在使用 Galaxy S10,android10。从 开始,三星设备的 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。下面是我的扫描回调代码。
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.我很好奇'Why is this problem only in the ble scanning?'我查了一下ble广告在熄屏状态下没有任何问题
补充5.广告也有问题……但不是必须的。我认为 MainActivity - Worker(来自 WorkManager)连接不好控制这种情况。
这是我的工作代码 - 即使设备屏幕已锁定。
更新:
感谢您提到您使用过 "WorkerManager"。之后只在我脑海中浮现。自 android 8 起,google 引入了电池优化功能,例如打瞌睡模式。因此,它不允许服务在休眠(打瞌睡模式)期间处于后台 运行。因此,您可以进行 BLE 扫描 **
using "Foreground Service"
** 而不是 Worker 或 Jobscheduler 等
请查看此 link:
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);
我就是这样解决问题的
- 使用'ForegroundService'
- 我没有检查workmanager是否可用,但是ForegroundService运行良好。我使用 timer 和 timertask 在前台重复这个过程。
- 授予权限“一直允许”
- 这是主要问题。打瞌睡模式不允许我的应用程序使用 GPS。所以我打开GPS设置并将我的应用程序的权限设置为允许使用应用程序时一直允许。
我正在使用 Galaxy S10,android10。从
下面是我的 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。下面是我的扫描回调代码。
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.我很好奇'Why is this problem only in the ble scanning?'我查了一下ble广告在熄屏状态下没有任何问题
补充5.广告也有问题……但不是必须的。我认为 MainActivity - Worker(来自 WorkManager)连接不好控制这种情况。
这是我的工作代码 - 即使设备屏幕已锁定。
更新:
感谢您提到您使用过 "WorkerManager"。之后只在我脑海中浮现。自 android 8 起,google 引入了电池优化功能,例如打瞌睡模式。因此,它不允许服务在休眠(打瞌睡模式)期间处于后台 运行。因此,您可以进行 BLE 扫描 **
using "Foreground Service"
** 而不是 Worker 或 Jobscheduler 等
请查看此 link: 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);
我就是这样解决问题的
- 使用'ForegroundService'
- 我没有检查workmanager是否可用,但是ForegroundService运行良好。我使用 timer 和 timertask 在前台重复这个过程。
- 授予权限“一直允许”
- 这是主要问题。打瞌睡模式不允许我的应用程序使用 GPS。所以我打开GPS设置并将我的应用程序的权限设置为允许使用应用程序时一直允许。