如果从 BOOT_COMPLETED 初始化,前台服务中的 BLE 扫描器不会返回扫描结果

问题描述 投票:0回答:1

所以情况如下。我有一个 Android 应用程序在运行 Android 10 的 AndroidTV 设备上运行。

该应用程序包含一个前台服务,它不断扫描特定设备(通过 MAC 地址)。像这样:

import no.nordicsemi.android.support.v18.scanner.BluetoothLeScannerCompat
import no.nordicsemi.android.support.v18.scanner.ScanCallback
import no.nordicsemi.android.support.v18.scanner.ScanFilter
import no.nordicsemi.android.support.v18.scanner.ScanResult
import no.nordicsemi.android.support.v18.scanner.ScanSettings

fun scan() {
    BluetoothLeScannerCompat.getScanner()
        .startScan(
            /* MAC address filters */ filters, 
            ScanSettings.Builder()
                .setLegacy(false)
                .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
                .setUseHardwareBatchingIfSupported(false)
                .setReportDelay(5000)
                .build(), 
            /* Standard callback */ callback
        )
}

当应用程序从启动器(MainActivity)启动时,效果很好:

override fun onCreate(savedInstanceState: Bundle?) {
    // ... UI stuff ...

    startForegroundService(Intent(this, BleService::class.java))
}

但是,当电视盒重新启动时,服务会像这样初始化(BOOT_COMPLETED)接收器:

class BootCompletedReceiver: BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == Intent.ACTION_BOOT_COMPLETED) {
            context?.startForegroundService(Intent(context, BleService::class.java))
        }
    }
}

现在奇怪的是,当这样启动服务时,没有任何scanResults!即使蓝牙设备在范围内。然而,因此从启动器打开应用程序并重新启动扫描仪确实会产生结果。 BluetoothAdapter D isLeEnabled(): ON BluetoothLeScanner D onScannerRegistered() - status=0 scannerId=5 mScannerId=0 BluetoothScanJob I Start Scan BluetoothS...b$callback I [onBatchScanResults]: Results=[]

需要考虑的一些事项:

服务正确初始化并启动 BLE 扫描仪,无论哪种方式都没有错误
  • 我总是在 LogCat 中得到
  • onScannerRegistered()
  • 确认
    因此这不可能是 
  • BOOT_COMPLETED
  • 广播 的问题 我尝试在服务启动和扫描仪初始化之间添加 20 秒的延迟。
  • 有或没有报告延迟使用都没有区别
  • 我已经添加了所有清单和运行时权限。请参阅下面我的清单以供参考:
  • <manifest <!-- Removed for brevity -->> <!-- Removed for brevity --> <!-- Bluetooth access up to SDK 30 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" /> <!-- Bluetooth access from SDK 30 onwards --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" tools:targetApi="31" /> <!-- Foreground service --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE"/> <!-- Autostart service --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-- Require BLE hardware capability --> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/> <application <!-- Removed for brevity -->> <receiver android:name=".service.BootCompletedReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <service android:name=".service.BleService" android:label="@string/service_name" android:description="@string/service_description" android:exported="false" android:foregroundServiceType="connectedDevice"/> <activity android:name=".ui.main.MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" tools:node="remove"> </provider> </application> </manifest>

android bluetooth-lowenergy nordic-semi
1个回答
0
投票
ACCESS_BACKGROUND_LOCATION

请注意<= 11.

如果您同时请求前台位置权限和后台位置权限,系统会忽略该请求,并且不会授予您的应用任何权限。

https://developer.android.com/develop/sensors-and-location/location/permissions#request-background-location

© www.soinside.com 2019 - 2024. All rights reserved.