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);
        
   

我就是这样解决问题的

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