Android BLE onScanResult 在 Android 11 上从未在后台调用。正在 Android 10 上工作

Ada*_*gyi 6 android android-bluetooth android-ble

我有一个扫描 BLE 设备的应用程序。它在 Android 10 上运行良好,但自从我将手机更新到Android 11后,如果我将应用程序置于后台或锁定屏幕,则onScanResult 永远不会被调用。

这很烦人。我还没有找到任何可能导致这种情况的合理想法。我在 Android 11 中没有发现任何表明此行为发生变化的差异。如果您将应用程序定位到 api 级别 31,则 Android 12 具有新的 BT 权限,但我确实将我的应用程序定位到 api 级别 30,并且我确实在 Android 11 上运行我的应用程序。

我完全一无所知。我尝试了不同的扫描模式,以及添加扫描过滤器,但没有任何改变。

我的扫描设置:

ScanSettings ss = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).build();
        List<ScanFilter> filterList = new ArrayList<>();
        filterList.add(new ScanFilter.Builder().setManufacturerData(Constants.HARDWARE_MANUFACTURER_ID, new byte[]{}).build());
        BluetoothUtil.getBluetoothLeScannerInstance().startScan(filterList, ss, leScanCallback);
Run Code Online (Sandbox Code Playgroud)

到目前为止,我经历了以下几点:

onScanResult当应用程序位于前台且设备屏幕未锁定时,通话效果良好。一旦我将应用程序推到后台或锁定屏幕,我就不再收到任何回调onScanResult

以下是应用程序位于前台而非锁定屏幕时的示例日志:

15:47:15 com.myapp.co I/BL_START: ...Starting BL scan. (Start of current window)
15:47:17 com.myapp.co I/SCANNED_: onScanResult ran!
15:47:21 com.myapp.co I/SCANNED_: onScanResult ran!
15:47:21 com.myapp.co I/SCANNED_: onScanResult ran!
15:47:22 com.myapp.co I/SCANNED_: onScanResult ran!
15:47:22 com.myapp.co I/BL_STOP: ...Finishing BL scan. (End of current window)
15:47:25 com.myapp.co I/BL_START: ...Starting BL scan. (Start of current window)
15:47:25 com.myapp.co I/SCANNED_: onScanResult ran!
15:47:26 com.myapp.co I/SCANNED_: onScanResult ran!
15:47:26 com.myapp.co I/SCANNED_: onScanResult ran!
15:47:29 com.myapp.co I/SCANNED_: onScanResult ran!
15:47:30 com.myapp.co I/SCANNED_: onScanResult ran!
15:47:30 com.myapp.co I/SCANNED_: onScanResult ran!
15:47:32 com.myapp.co I/BL_STOP: ...Finishing BL scan. (End of current window)
Run Code Online (Sandbox Code Playgroud)

应用程序处于后台和/或锁定屏幕时的示例日志:

15:48:25 com.myapp.co I/BL_START: ...Starting BL scan. (Start of current window)
15:48:32 com.myapp.co I/BL_STOP: ...Finishing BL scan. (End of current window)
15:48:35 com.myapp.co I/BL_START: ...Starting BL scan. (Start of current window)
15:48:42 com.myapp.co I/BL_STOP: ...Finishing BL scan. (End of current window)
15:48:45 com.myapp.co I/BL_START: ...Starting BL scan. (Start of current window)
15:48:52 com.myapp.co I/BL_STOP: ...Finishing BL scan. (End of current window)
15:48:55 com.myapp.co I/BL_START: ...Starting BL scan. (Start of current window)
15:49:02 com.myapp.co I/BL_STOP: ...Finishing BL scan. (End of current window)
15:49:05 com.myapp.co I/BL_START: ...Starting BL scan. (Start of current window)
15:49:12 com.myapp.co I/BL_STOP: ...Finishing BL scan. (End of current window)
15:49:15 com.myapp.co I/BL_START: ...Starting BL scan. (Start of current window)
15:49:22 com.myapp.co I/BL_STOP: ...Finishing BL scan. (End of current window)
15:49:25 com.myapp.co I/BL_START: ...Starting BL scan. (Start of current window)
15:49:32 com.myapp.co I/BL_STOP: ...Finishing BL scan. (End of current window)
15:49:35 com.myapp.co I/BL_START: ...Starting BL scan. (Start of current window)
15:49:42 com.myapp.co I/BL_STOP: ...Finishing BL scan. (End of current window)
Run Code Online (Sandbox Code Playgroud)

正如您所看到onScanResult的,当应用程序位于前台并且屏幕未锁定时,它们会被正常调用。

什么可能导致这种情况,以及如何防止此类功能?