启动BluetoothLeScanner扫描时应用崩溃无结果,触发空对象引用报错
解决BluetoothLeScanner启动扫描时的空指针崩溃问题
从你给出的错误信息来看,核心问题是**mBluetoothLeScanner对象为null时,你调用了它的startScan()方法**,触发了NullPointerException。错误发生在BleDevicesActivity.java的第91行,这说明你的蓝牙扫描器实例没有正确初始化。
下面是一步步的排查和修复方案:
1. 先确认设备是否支持BLE
有些旧设备不支持蓝牙低功耗(BLE),在初始化蓝牙相关组件前,先做个检查:
// 在Activity的onCreate方法中添加 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, "当前设备不支持BLE功能", Toast.LENGTH_LONG).show(); finish(); // 不支持的话直接关闭页面 }
2. 确保蓝牙已正常开启
BluetoothLeScanner依赖于已开启的蓝牙Adapter,所以要先获取Adapter并检查蓝牙状态:
// 定义请求码,比如 private static final int REQUEST_ENABLE_BT = 1; // 获取蓝牙管理器和Adapter BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter(); // 检查Adapter是否存在,以及蓝牙是否开启 if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); }
之后在onActivityResult里处理蓝牙开启的结果,确保蓝牙开启后再初始化扫描器。
3. 正确初始化BluetoothLeScanner
只有当蓝牙Adapter有效且蓝牙已开启时,才能成功获取扫描器实例:
// 确保在蓝牙开启后执行这段代码 if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) { mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner(); }
如果这一步后mBluetoothLeScanner还是null,大概率是设备的BLE硬件有问题,但这种情况很少见,多数是前面的步骤没做对。
4. 检查权限是否齐全
Android系统对BLE扫描有严格的权限要求:
- 在
AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
- Android 6.0及以上需要动态申请位置权限(因为BLE扫描依赖位置服务):
private static final int REQUEST_LOCATION_PERMISSION = 2; // 在初始化扫描前检查权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION); }
5. 调用startScan前做非空判断
最后,在你原来的startScanning()方法里,先检查扫描器是否有效,再调用扫描:
public void startScanning() { // 先判断扫描器是否初始化成功 if (mBluetoothLeScanner == null) { Toast.makeText(this, "蓝牙扫描器初始化失败,请检查蓝牙状态", Toast.LENGTH_SHORT).show(); return; } // 执行扫描 mBluetoothLeScanner.startScan(buildScanFilters(), buildScanSettings(), mScanCallback); }
按照以上步骤逐一排查,应该就能解决这个空指针崩溃的问题了。
内容的提问来源于stack exchange,提问作者diamantis
相关产品推荐
相关产品推荐

