[英]Android BLE scan with screen off (with Galaxy)
我正在使用 Galaxy S10、android 10。從這里開始,使用三星設備的 BLE 掃描需要非空掃描過濾器才能在屏幕關閉 state 中進行掃描。
下面是我的 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掃描中?” 我檢查了 state 屏幕上的 ble 廣告沒有任何問題。
補充5。廣告也有問題……但不是必須的。 我認為 MainActivity - Worker (from WorkManager) 連接不利於控制這種情況。
這就是我解決問題的方法
這是我的工作代碼 - 甚至設備屏幕也被鎖定。
更新:
感謝您提到您使用了“ 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.