Android 13中BluetoothLeScanner.startScan报callback null异常求助
排查
IllegalArgumentException: callback is null 异常的建议 针对你在Android 13设备上调用bluetoothLeScanner.startScan(scanCallback)时遇到的问题,结合你已确认的权限配置、bluetoothLeScanner非空的情况,给出以下具体排查方向:
1. 确认scanCallback的初始化时机与非空性
- 检查
scanCallback是否在调用startScan前完成初始化:- 如果使用
lateinit var声明,确保调用startScan前已执行赋值操作(未初始化的lateinit变量可能被误判为null传递); - 如果使用可空类型
var scanCallback: ScanCallback? = null,必须在调用startScan前通过空安全检查(比如scanCallback?.let { bluetoothLeScanner.startScan(it) }),避免null被传递; - 排查是否存在分支逻辑导致
scanCallback未赋值:比如仅在特定条件下初始化scanCallback,但调用startScan时该条件不满足。
- 如果使用
2. 检查是否存在变量重名或作用域问题
- 确认调用
startScan时使用的scanCallback是你调试时看到的非空实例:- 排查是否存在局部变量与全局变量重名的情况,局部变量未初始化就被传递,而你调试时查看的是全局变量;
- 直接在
startScan调用前添加日志或断点,打印scanCallback的内存地址,确认其不为null。
3. 排查ScanCallback的实现是否存在隐性问题
- 确保你的
ScanCallback实现完整且正确:- 避免使用错误方式创建
ScanCallback实例(比如误用lambda表达式转抽象类的写法,导致实例为null); - 示例正确实现:
private val scanCallback = object : ScanCallback() { override fun onScanResult(callbackType: Int, result: ScanResult?) { // 处理扫描结果 } override fun onBatchScanResults(results: MutableList<ScanResult>?) { // 处理批量扫描结果 } override fun onScanFailed(errorCode: Int) { // 处理扫描失败 } }
- 避免使用错误方式创建
4. 确认调用的startScan重载方法正确
- 检查是否误调用了需要
ScanFilter和ScanSettings的重载方法:- 比如错误写成
bluetoothLeScanner.startScan(emptyList(), null, scanCallback),此时参数位置错误可能引发异常; - 确保调用的是单参数重载:
bluetoothLeScanner.startScan(scanCallback)。
- 比如错误写成
5. 验证Android 13蓝牙扫描的权限细节
虽然你已确认权限配置,但再核对以下点:
- Manifest中需配置:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 若需后台扫描,添加以下权限 --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" /> - 确认在运行时已动态申请
BLUETOOTH_SCAN和ACCESS_FINE_LOCATION权限(Android 13中BLUETOOTH_SCAN属于危险权限,需动态申请)。
内容的提问来源于stack exchange,提问作者Liza Gildisch
相关产品推荐
相关产品推荐

